“Baby Mental Life: Study 1” was conducted on MTurk on 2018-07-31 through 2018-08-01.
Our planned sample was 300 participants, and we anticipated that roughly 85-90% of recruited participants would pass all of our attention checks, so we initially recruited 342 participants (on the idea that ~87.5% of 342 ~ 300 participants; note that for administrative purposes we need to recuit participants in batches that were divisible by 9). After filtering out participants who failed at least one of our attention checks, we ended up retaining only 80% of participants, so we recruited an additional 36 participants for a total of 378 people recruited (on the idea that ~80% of 378 ~ 300 participants; note that for administrative purposes we need to recuit participants in batches that were divisible by 9). In a slight deviation from our preregistered recruitment plan, we limited these additional 36 participants to women, because we had an unexpectedly large imbalance of men to women.
UPDATE: On 2018-08-09, KW discovered that there were many repeating GPS locations, a symptom of a recent outbreak of bots on MTurk. As of 2019-05-15, these data INCLUDE participants where there is another participant with an identical set of GPS coordinates as recorded by Qualtrics. Excluding these participants would exclude 76 participants (25%).
In the end, we ended up with a sample of 301 participants who passed our attention checks, 225 of whom came from unique GPS coordinates.
Each participant assessed children’s mental capacities at 3 target ages: newborns, 9-month-olds, and 5-year-olds. For each target, they rated 60 mental capacities on a scale from 0 (not at all capable) to 100 (completely capable).
For more details about the study, see our preregistration here.
[30m── [1mAttaching packages[22m ─────────────────────────────────────── tidyverse 1.2.1 ──[39m
[30m[32m✔[30m [34mggplot2[30m 3.1.1 [32m✔[30m [34mpurrr [30m 0.2.5
[32m✔[30m [34mtibble [30m 2.1.1 [32m✔[30m [34mdplyr [30m 0.7.6
[32m✔[30m [34mtidyr [30m 0.8.1 [32m✔[30m [34mstringr[30m 1.3.1
[32m✔[30m [34mreadr [30m 1.1.1 [32m✔[30m [34mforcats[30m 0.3.0[39m
package ‘ggplot2’ was built under R version 3.5.2package ‘tibble’ was built under R version 3.5.2[30m── [1mConflicts[22m ────────────────────────────────────────── tidyverse_conflicts() ──
[31m✖[30m [34mdplyr[30m::[32mfilter()[30m masks [34mstats[30m::filter()
[31m✖[30m [34mdplyr[30m::[32mlag()[30m masks [34mstats[30m::lag()[39m
Attaching package: ‘langcog’
The following object is masked from ‘package:base’:
scale
Attaching package: ‘psych’
The following objects are masked from ‘package:ggplot2’:
%+%, alpha
Loading required package: Matrix
Attaching package: ‘Matrix’
The following object is masked from ‘package:tidyr’:
expand
Data preparation
NAs introduced by coercionattributes are not identical across measure variables;
they will be droppedJoining, by = "question_qualtrics"
NAs introduced by coercion
EFA: all targets
Our primary analysis is an exploratory factor analysis (EFA) collapsing across all 3 target characters (and treating an individual participant’s responses to each character as if they were independent data points) - see the preregistration for more details.
We planned to examine three factor retention protocols in order to determine how many factors to retain: Parallel analysis, minimizing BIC, and a set of preset criteria outlined in Weisman et al. (2017). Here we look at each solution in turn.
Rotation choices
We planned to examine oblimin-rotated solutions (which allow factors to correlate), but you could examine other rotation options by selecting a different rotation type here.
Parallel analysis
How many factors to retain?
Parallel analysis suggests that the number of factors = 4 and the number of components = 3
Call: fa.parallel(x = d_all, plot = F)
Parallel analysis suggests that the number of factors = 4 and the number of components = 3
Eigen Values of
What are these factors?
Loading required namespace: GPArotation
A loading greater than abs(1) was detected. Examine the loadings carefully.
Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to which targets?
Ignoring unknown aesthetics: y

Here’s a multilevel linear regression on these factor scores, with random intercepts and slopes (for target and factor) by participant. Target is coded with linear and quadratic contrasts, and factor is effect-coded for comparison with the grand mean (with the last factor as the base, -1):
Linear mixed model fit by REML ['lmerMod']
Formula: score ~ target * factor + (target + factor | ResponseId)
Data: efa_all_par_scores
REML criterion at convergence: 7036.7
Scaled residuals:
Min 1Q Median 3Q Max
-3.7531 -0.5165 0.0146 0.5656 3.1771
Random effects:
Groups Name Variance Std.Dev. Corr
ResponseId (Intercept) 0.29003 0.5385
target.L 0.16960 0.4118 -0.26
target.Q 0.01948 0.1396 -0.84 0.37
factor1 0.20636 0.4543 -0.44 -0.52 0.19
factor2 0.29750 0.5454 0.26 0.68 0.11 -0.83
factor3 0.03002 0.1733 -0.17 -0.14 0.26 0.30 0.14
Residual 0.22433 0.4736
Number of obs: 3612, groups: ResponseId, 301
Fixed effects:
Estimate Std. Error t value
(Intercept) -1.279e-15 3.203e-02 0.000
target.L 7.567e-01 2.738e-02 27.636
target.Q 5.780e-02 1.584e-02 3.648
factor1 1.350e-15 2.953e-02 0.000
factor2 -1.712e-15 3.427e-02 0.000
factor3 -3.760e-17 1.691e-02 0.000
target.L:factor1 3.775e-01 2.364e-02 15.966
target.Q:factor1 2.295e-01 2.364e-02 9.706
target.L:factor2 -3.939e-01 2.364e-02 -16.663
target.Q:factor2 -9.555e-02 2.364e-02 -4.041
target.L:factor3 2.949e-01 2.364e-02 12.474
target.Q:factor3 -2.535e-01 2.364e-02 -10.724
If we consider t-values > 2 to be “significant” and use the plot above to guide our interpretation, here’s what we conclude:
- [
(Intercept): By definition, because we’re using factor scores, which are similar to z-scores, the intercept is ~0.]
target.L: Overall, mental capacity attributions increase with target age.
target.Q: This increase is generally non-linear.
- [
factor1, factor2, …: By definition, because we’re using factor scores, which are similar to z-scores, the differences in means across factors are ~0.]
target.L:factor1: The linear increase is more dramatic (steeper slope) for MR1, compared to other factors.
target.Q:factor1: The nonlinearity is more dramatic (curvier and/or concave instead of convex curve) for MR1, compared to other factors.
target.L:factor2: The linear increase is less dramatic (shallower slope) for MR2, compared to other factors.
target.Q:factor2: The nonlinearity is less dramatic (flatter curve) for MR2, compared to other factors.
target.L:factor3: The linear increase is more dramatic (steeper slope) for MR3, compared to other factors.
target.Q:factor3: The nonlinearity is less dramatic (flatter curve) for MR3, compared to other factors.
Joining, by = "capacity"
|===================================== | 69% ~1 s remaining
|===================================== | 70% ~1 s remaining
|====================================== | 71% ~1 s remaining
|======================================= | 72% ~1 s remaining
|======================================= | 74% ~1 s remaining
|======================================== | 75% ~1 s remaining
|========================================= | 76% ~1 s remaining
|========================================= | 77% ~1 s remaining
|========================================== | 78% ~1 s remaining
|========================================== | 79% ~1 s remaining
|=========================================== | 81% ~1 s remaining
|============================================ | 82% ~1 s remaining
|============================================= | 84% ~1 s remaining
|============================================== | 86% ~0 s remaining
|=============================================== | 87% ~0 s remaining
|=============================================== | 88% ~0 s remaining
|================================================ | 90% ~0 s remaining
|================================================= | 91% ~0 s remaining
|================================================= | 92% ~0 s remaining
|================================================== | 93% ~0 s remaining
|================================================== | 94% ~0 s remaining
|=================================================== | 96% ~0 s remaining
|==================================================== | 97% ~0 s remaining
|==================================================== | 98% ~0 s remaining
|===================================================== | 98% ~0 s remaining
|===================================================== | 99% ~0 s remaining
|===================================================== | 99% ~0 s remaining
Joining, by = c("capacity", "factor", "order")

Minimizing BIC
How many factors to retain?
Very Simple Structure
Call: vss(x = x, n = n, rotate = rotate, diagonal = diagonal, fm = fm,
n.obs = n.obs, plot = plot, title = title, use = use, cor = cor)
VSS complexity 1 achieves a maximimum of 0.94 with 1 factors
VSS complexity 2 achieves a maximimum of 0.99 with 2 factors
The Velicer MAP achieves a minimum of 0.01 with 6 factors
BIC achieves a minimum of -6013.88 with 6 factors
Sample Size adjusted BIC achieves a minimum of -1658.73 with 8 factors
Statistics by number of factors
What are these factors?
convergence not obtained in GPFoblq. 1000 iterations used. A loading greater than abs(1) was detected. Examine the loadings carefully.
Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to which targets?
Ignoring unknown aesthetics: y

Here’s a multilevel linear regression on these factor scores, with random intercepts and slopes (for target and factor) by participant. Target is coded with linear and quadratic contrasts, and factor is effect-coded for comparison with the grand mean (with the last factor as the base, -1):
If we consider t-values > 2 to be “significant” and use the plot above to guide our interpretation, here’s what we conclude:
- [
(Intercept): By definition, because we’re using factor scores, which are similar to z-scores, the intercept is ~0.]
target.L: Overall, mental capacity attributions increase with target age.
target.Q: This increase is not generally non-linear.
- [
factor1, factor2, …: By definition, because we’re using factor scores, which are similar to z-scores, the differences in means across factors are ~0.]
target.L:factor1: The linear increase is more dramatic (steeper slope) for MR1, compared to other factors.
target.Q:factor1: The nonlinearity is more dramatic (curvier and/or concave instead of convex curve) for MR1, compared to other factors.
target.L:factor2: The linear increase is less dramatic (shallower slope) for MR2, compared to other factors.
target.Q:factor2: The nonlinearity for MR2 is comparable to other factors.
target.L:factor3: The linear increase is more dramatic (steeper slope) for MR3, compared to other factors.
target.Q:factor3: The nonlinearity is less dramatic (flatter curve) for MR3, compared to other factors.
target.L:factor4: The linear increase is less dramatic (shallower slope) for MR4, compared to other factors.
target.Q:factor4: The nonlinearity is more dramatic (curvier and/or concanve instead of convex curve) for MR4, compared to other factors.
target.L:factor5: The linear increase is more dramatic (steeper slope) for MR5, compared to other factors.
target.Q:factor5: The nonlinearity is less dramatic (flatter curve) for MR5, compared to other factors.
Joining, by = "capacity"
|=============================================== | 88% ~0 s remaining
|================================================ | 91% ~0 s remaining
|================================================== | 93% ~0 s remaining
|=================================================== | 95% ~0 s remaining
|==================================================== | 98% ~0 s remaining
Joining, by = c("capacity", "factor", "order")

How do these compare to parallel analysis?
Joining, by = "capacity"
Preset retention criteria
How many factors to retain?
[1] "Preset criteria suggest retaining 2 factors"
What are these factors?
Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to which targets?
Ignoring unknown aesthetics: y

Here’s a multilevel linear regression on these factor scores, with random intercepts and slopes (for target and factor) by participant. Target is coded with linear and quadratic contrasts, and factor is effect-coded for comparison with the grand mean (with the last factor as the base, -1):
unable to evaluate scaled gradientModel failed to converge: degenerate Hessian with 1 negative eigenvalues
Linear mixed model fit by REML ['lmerMod']
Formula: score ~ target * factor + (target + factor | ResponseId)
Data: efa_all_k_scores
REML criterion at convergence: 3395.6
Scaled residuals:
Min 1Q Median 3Q Max
-3.6194 -0.5160 -0.0066 0.5597 2.6303
Random effects:
Groups Name Variance Std.Dev. Corr
ResponseId (Intercept) 0.2968 0.5448
target.L 0.2112 0.4595 -0.31
target.Q 0.0134 0.1158 -1.00 0.25
factor1 0.1565 0.3957 -0.37 -0.64 0.41
Residual 0.1652 0.4065
Number of obs: 1806, groups: ResponseId, 301
Fixed effects:
Estimate Std. Error t value
(Intercept) -1.688e-16 3.283e-02 0.000
target.L 9.083e-01 3.124e-02 29.074
target.Q 3.140e-02 1.786e-02 1.758
factor1 1.392e-15 2.473e-02 0.000
target.L:factor1 2.596e-01 1.657e-02 15.671
target.Q:factor1 1.729e-01 1.657e-02 10.437
convergence code: 0
unable to evaluate scaled gradient
Model failed to converge: degenerate Hessian with 1 negative eigenvalues
There are some problems with this model that I haven’t addressed - see warnings above. Ignoring them for now…
If we consider t-values > 2 to be “significant” and use the plot above to guide our interpretation, here’s what we conclude:
- [
(Intercept): By definition, because we’re using factor scores, which are similar to z-scores, the intercept is ~0.]
target.L: Overall, mental capacity attributions increase with target age.
target.Q: This increase is generally non-linear.
- [
factor1: By definition, because we’re using factor scores, which are similar to z-scores, the differences in means across factors are ~0.]
target.L:factor1: The linear increase is more dramatic (steeper slope) for MR1, compared to other factors.
target.Q:factor1: The nonlinearity is more dramatic (curvier and/or concave instead of convex curve) for MR1, compared to other factors.
Joining, by = "capacity"
|================================================ | 89% ~0 s remaining
|================================================= | 92% ~0 s remaining
|================================================== | 94% ~0 s remaining
|=================================================== | 96% ~0 s remaining
|===================================================== | 98% ~0 s remaining
Joining, by = c("capacity", "factor", "order")

How do these compare to parallel analysis?
Joining, by = "capacity"
EFA: newborns
What happens if we limit ourselves to assessments of newborns’ mental capacities?
Parallel analysis
How many factors to retain?
Parallel analysis suggests that the number of factors = 4 and the number of components = 3
Call: fa.parallel(x = d_00mo, plot = F)
Parallel analysis suggests that the number of factors = 4 and the number of components = 3
Eigen Values of
What are these factors?
A loading greater than abs(1) was detected. Examine the loadings carefully.
Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to newborns?
Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

Minimizing BIC
How many factors to retain?
Very Simple Structure
Call: vss(x = x, n = n, rotate = rotate, diagonal = diagonal, fm = fm,
n.obs = n.obs, plot = plot, title = title, use = use, cor = cor)
VSS complexity 1 achieves a maximimum of 0.86 with 1 factors
VSS complexity 2 achieves a maximimum of 0.98 with 2 factors
The Velicer MAP achieves a minimum of 0.01 with 4 factors
BIC achieves a minimum of -6124.8 with 4 factors
Sample Size adjusted BIC achieves a minimum of -1385.1 with 8 factors
Statistics by number of factors
What are these factors?
A loading greater than abs(1) was detected. Examine the loadings carefully.
Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to newborns?
Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

Preset retention criteria
How many factors to retain?
[1] "Preset criteria suggest retaining 2 factors"
What are these factors?
Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to newborns?
Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

EFA: 9-month-olds
What happens if we limit ourselves to assessments of 9-month-olds’ mental capacities?
Parallel analysis
How many factors to retain?
Parallel analysis suggests that the number of factors = 4 and the number of components = 2
Call: fa.parallel(x = d_09mo, plot = F)
Parallel analysis suggests that the number of factors = 4 and the number of components = 2
Eigen Values of
What are these factors?
Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to 9-month-olds?
Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

Minimizing BIC
How many factors to retain?
Very Simple Structure
Call: vss(x = x, n = n, rotate = rotate, diagonal = diagonal, fm = fm,
n.obs = n.obs, plot = plot, title = title, use = use, cor = cor)
VSS complexity 1 achieves a maximimum of 0.86 with 1 factors
VSS complexity 2 achieves a maximimum of 0.98 with 2 factors
The Velicer MAP achieves a minimum of 0.01 with 6 factors
BIC achieves a minimum of -5996.91 with 4 factors
Sample Size adjusted BIC achieves a minimum of -1366.77 with 8 factors
Statistics by number of factors
What are these factors?
Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to 9-month-olds?
Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

Preset retention criteria
How many factors to retain?
[1] "Preset criteria suggest retaining 2 factors"
What are these factors?
Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to 9-month-olds?
Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

EFA: 5-year-olds
What happens if we limit ourselves to assessments of 5-year-olds’ mental capacities?
Parallel analysis
How many factors to retain?
Parallel analysis suggests that the number of factors = 3 and the number of components = 2
Call: fa.parallel(x = d_60mo, plot = F)
Parallel analysis suggests that the number of factors = 3 and the number of components = 2
Eigen Values of
What are these factors?
A loading greater than abs(1) was detected. Examine the loadings carefully.
Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to 5-year-olds?
Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

Minimizing BIC
How many factors to retain?
Very Simple Structure
Call: vss(x = x, n = n, rotate = rotate, diagonal = diagonal, fm = fm,
n.obs = n.obs, plot = plot, title = title, use = use, cor = cor)
VSS complexity 1 achieves a maximimum of 0.96 with 1 factors
VSS complexity 2 achieves a maximimum of 0.99 with 2 factors
The Velicer MAP achieves a minimum of 0.01 with 6 factors
BIC achieves a minimum of -4946.45 with 5 factors
Sample Size adjusted BIC achieves a minimum of -470.82 with 8 factors
Statistics by number of factors
What are these factors?
Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to 5-year-olds?
Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

Preset retention criteria
How many factors to retain?
[1] "Preset criteria suggest retaining 2 factors"
What are these factors?
Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to 5-year-olds?
Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

Subset of capacities from Weisman et al. (2017)
Parallel analysis suggests that the number of factors = 3 and the number of components = 2

Very Simple Structure
Call: vss(x = x, n = n, rotate = rotate, diagonal = diagonal, fm = fm,
n.obs = n.obs, plot = plot, title = title, use = use, cor = cor)
VSS complexity 1 achieves a maximimum of 0.91 with 1 factors
VSS complexity 2 achieves a maximimum of 0.99 with 2 factors
The Velicer MAP achieves a minimum of 0.01 with 3 factors
BIC achieves a minimum of -995.35 with 5 factors
Sample Size adjusted BIC achieves a minimum of -249.51 with 8 factors
Statistics by number of factors

[1] 2
Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Demographics


Joining, by = "ResponseId"


Joining, by = "ResponseId"




Joining, by = "ResponseId"


Joining, by = "ResponseId"




Joining, by = "ResponseId"




Save EFA output
Finally, I’ll export the 4-factor EFA results to a saved file that I can draw on in our Study 2 analyses.
LS0tCnRpdGxlOiAiQmFieSBNZW50YWwgTGlmZTogU3R1ZHkgMSIKZGF0ZTogMjAxOS0wNS0xNQpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlID0gRn0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAwLjY3LCBpbmNsdWRlID0gVCwgZWNobyA9IEYpCmBgYAoKIkJhYnkgTWVudGFsIExpZmU6IFN0dWR5IDEiIHdhcyBjb25kdWN0ZWQgb24gTVR1cmsgb24gMjAxOC0wNy0zMSB0aHJvdWdoIDIwMTgtMDgtMDEuCgpPdXIgcGxhbm5lZCBzYW1wbGUgd2FzIDMwMCBwYXJ0aWNpcGFudHMsIGFuZCB3ZSBhbnRpY2lwYXRlZCB0aGF0IHJvdWdobHkgODUtOTAlIG9mIHJlY3J1aXRlZCBwYXJ0aWNpcGFudHMgd291bGQgcGFzcyBhbGwgb2Ygb3VyIGF0dGVudGlvbiBjaGVja3MsIHNvIHdlIGluaXRpYWxseSByZWNydWl0ZWQgMzQyIHBhcnRpY2lwYW50cyAob24gdGhlIGlkZWEgdGhhdCB+ODcuNSUgb2YgMzQyIH4gMzAwIHBhcnRpY2lwYW50czsgbm90ZSB0aGF0IGZvciBhZG1pbmlzdHJhdGl2ZSBwdXJwb3NlcyB3ZSBuZWVkIHRvIHJlY3VpdCBwYXJ0aWNpcGFudHMgaW4gYmF0Y2hlcyB0aGF0IHdlcmUgZGl2aXNpYmxlIGJ5IDkpLiBBZnRlciBmaWx0ZXJpbmcgb3V0IHBhcnRpY2lwYW50cyB3aG8gZmFpbGVkIGF0IGxlYXN0IG9uZSBvZiBvdXIgYXR0ZW50aW9uIGNoZWNrcywgd2UgZW5kZWQgdXAgcmV0YWluaW5nIG9ubHkgODAlIG9mIHBhcnRpY2lwYW50cywgc28gd2UgcmVjcnVpdGVkIGFuIGFkZGl0aW9uYWwgMzYgcGFydGljaXBhbnRzIGZvciBhIHRvdGFsIG9mIDM3OCBwZW9wbGUgcmVjcnVpdGVkIChvbiB0aGUgaWRlYSB0aGF0IH44MCUgb2YgMzc4IH4gMzAwIHBhcnRpY2lwYW50czsgbm90ZSB0aGF0IGZvciBhZG1pbmlzdHJhdGl2ZSBwdXJwb3NlcyB3ZSBuZWVkIHRvIHJlY3VpdCBwYXJ0aWNpcGFudHMgaW4gYmF0Y2hlcyB0aGF0IHdlcmUgZGl2aXNpYmxlIGJ5IDkpLiBJbiBhIHNsaWdodCBkZXZpYXRpb24gZnJvbSBvdXIgcHJlcmVnaXN0ZXJlZCByZWNydWl0bWVudCBwbGFuLCB3ZSBsaW1pdGVkIHRoZXNlIGFkZGl0aW9uYWwgMzYgcGFydGljaXBhbnRzIHRvIHdvbWVuLCBiZWNhdXNlIHdlIGhhZCBhbiB1bmV4cGVjdGVkbHkgbGFyZ2UgaW1iYWxhbmNlIG9mIG1lbiB0byB3b21lbi4gCgoqKlVQREFURTogT24gMjAxOC0wOC0wOSwgS1cgZGlzY292ZXJlZCB0aGF0IHRoZXJlIHdlcmUgbWFueSByZXBlYXRpbmcgR1BTIGxvY2F0aW9ucywgYSBzeW1wdG9tIG9mIGEgcmVjZW50IG91dGJyZWFrIG9mIGJvdHMgb24gTVR1cmsuIEFzIG9mIDIwMTktMDUtMTUsIHRoZXNlIGRhdGEgX0lOQ0xVREVfIHBhcnRpY2lwYW50cyB3aGVyZSB0aGVyZSBpcyBhbm90aGVyIHBhcnRpY2lwYW50IHdpdGggYW4gaWRlbnRpY2FsIHNldCBvZiBHUFMgY29vcmRpbmF0ZXMgYXMgcmVjb3JkZWQgYnkgUXVhbHRyaWNzLiBFeGNsdWRpbmcgdGhlc2UgcGFydGljaXBhbnRzIHdvdWxkIGV4Y2x1ZGUgNzYgcGFydGljaXBhbnRzICgyNSUpLioqCgpJbiB0aGUgZW5kLCB3ZSBlbmRlZCB1cCB3aXRoIGEgc2FtcGxlIG9mIDMwMSBwYXJ0aWNpcGFudHMgd2hvIHBhc3NlZCBvdXIgYXR0ZW50aW9uIGNoZWNrcywgMjI1IG9mIHdob20gY2FtZSBmcm9tIHVuaXF1ZSBHUFMgY29vcmRpbmF0ZXMuCgpFYWNoIHBhcnRpY2lwYW50IGFzc2Vzc2VkIGNoaWxkcmVuJ3MgbWVudGFsIGNhcGFjaXRpZXMgYXQgMyB0YXJnZXQgYWdlczogbmV3Ym9ybnMsIDktbW9udGgtb2xkcywgYW5kIDUteWVhci1vbGRzLiBGb3IgZWFjaCB0YXJnZXQsIHRoZXkgcmF0ZWQgNjAgbWVudGFsIGNhcGFjaXRpZXMgb24gYSBzY2FsZSBmcm9tIDAgKG5vdCBhdCBhbGwgY2FwYWJsZSkgdG8gMTAwIChjb21wbGV0ZWx5IGNhcGFibGUpLiAKCkZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhlIHN0dWR5LCBzZWUgb3VyIHByZXJlZ2lzdHJhdGlvbiBbaGVyZV0oaHR0cHM6Ly9vc2YuaW8vZTZhamgvKS4gCgpgYGB7cn0KIyBsb2FkIHJlcXVpcmVkIGxpYnJhcmllcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShsYW5nY29nKSAjIHNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2xhbmdjb2cvbGFuZ2NvZy1wYWNrYWdlCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkobG1lNCkKCiMgc2V0IHRoZW1lIGZvciBnZ3Bsb3RzCnRoZW1lX3NldCh0aGVtZV9idygpKQpgYGAKCmBgYHtyfQojIHJ1biBzb3VyY2UgY29kZSAoZXh0cmEgaG9tZS1tYWRlIGZ1bmN0aW9ucykKc291cmNlKCIuL3NjcmlwdHMvbWF4X2ZhY3RvcnNfZWZhLlIiKQpzb3VyY2UoIi4vc2NyaXB0cy9wbG90X2Z1bi5SIikKc291cmNlKCIuL3NjcmlwdHMvcmV0ZW5fZnVuLlIiKQpgYGAKCgojIERhdGEgcHJlcGFyYXRpb24KCmBgYHtyfQojIGxvYWQgaW4gZGUtaWRlbnRpZmllZCByYXcgZGF0YQpkMCA8LSByZWFkLmNzdigiLi9kYXRhL2RlaWRlbnRpZmllZC9iYWJ5X21lbnRhbF9saWZlX3MxX2RhdGEuY3N2IikgJT4lIHNlbGVjdCgtWCkKYGBgCgpgYGB7cn0KIyBtYWtlIHF1ZXN0aW9uIGtleQpxdWVzdGlvbl9rZXkgPC0gZDBbMSxdICU+JQogIHQoKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJxdWVzdGlvbl9xdWFsdHJpY3MiKSAlPiUKICByZW5hbWUoInF1ZXN0aW9uX3RleHQiID0gWDEpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IHJlY29kZShxdWVzdGlvbl9xdWFsdHJpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJEdXJhdGlvbi4uaW4uc2Vjb25kcy4iID0gIkR1cmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEyIiA9ICJBZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTMiID0gIkdlbmRlclNleCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRM18zX1RFWFQiID0gIkdlbmRlclNleF9maWxsSW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTQiID0gIkVuZ2xpc2hQcm9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlE1IiA9ICJGaXJzdExhbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTVfMl9URVhUIiA9ICJGaXJzdExhbmdfZmlsbEluIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlExOCIgPSAiUmFjZUV0aG5pY2l0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRMThfMTBfVEVYVCIgPSAiUmFjZUV0aG5pY2l0eV9maWxsSW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTE5IiA9ICJFZHVjYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTIwIiA9ICJJbmNvbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTIxIiA9ICJNYXJpdGFsU3RhdHVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEyMV82X1RFWFQiID0gIk1hcml0YWxTdGF0dXNfZmlsbEluIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEyMiIgPSAiSG91c2Vob2xkU2l6ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRMjMiID0gIlBhcmVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRMjUiID0gIkNoaWxkcmVuTnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEyNiIgPSAiQ2hpbGRyZW5Zb3VuZ2VzdEFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRMjZfMV9URVhUIiA9ICJDaGlsZHJlbllvdW5nZXN0QWdlX2ZpbGxJbjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTI2XzJfVEVYVCIgPSAiQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9maWxsSW4yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEyNyIgPSAiQ2hpbGRyZW5PbGRlc3RBZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTI3XzFfVEVYVCIgPSAiQ2hpbGRyZW5PbGRlc3RBZ2VfZmlsbEluMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRMjdfMl9URVhUIiA9ICJDaGlsZHJlbk9sZGVzdEFnZV9maWxsSW4yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEyOCIgPSAiQXR0ZW50aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEyOSIgPSAiQ29tbWVudHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9IHF1ZXN0aW9uX3F1YWx0cmljcyksCiAgICAgICAgIHF1ZXN0aW9uID0gY2FzZV93aGVuKGdyZXBsKCJ0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucyIsIHF1ZXN0aW9uX3RleHQpIH4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3ViKCJeLipleHRlbnQgaXMgYSAiLCAiIiwgcXVlc3Rpb25fdGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBxdWVzdGlvbiksCiAgICAgICAgIHF1ZXN0aW9uID0gY2FzZV93aGVuKGdyZXBsKCJjYXBhYmxlIG9mLi4uIiwgcXVlc3Rpb25fdGV4dCkgfgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdWIoImNhcGFibGUgb2YuLi4gIiwgIiIsIHRvbG93ZXIocXVlc3Rpb24pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IHF1ZXN0aW9uKSwKICAgICAgICAgcXVlc3Rpb24gPSBnc3ViKCIgIiwgIl8iLCBxdWVzdGlvbiksCiAgICAgICAgIHF1ZXN0aW9uID0gZ3N1YigiJyIsICIiLCBxdWVzdGlvbiksCiAgICAgICAgIHF1ZXN0aW9uID0gZ3N1YigibmV3Ym9ybl8tXyIsICJ0YXJnZXQwMG1vXyIsIHF1ZXN0aW9uKSwKICAgICAgICAgcXVlc3Rpb24gPSBnc3ViKCI5LW1vbnRoLW9sZF8tXyIsICJ0YXJnZXQwOW1vXyIsIHF1ZXN0aW9uKSwKICAgICAgICAgcXVlc3Rpb24gPSBnc3ViKCI1LXllYXItb2xkXy1fIiwgInRhcmdldDYwbW9fIiwgcXVlc3Rpb24pKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCItIiwgIl8iLCBxdWVzdGlvbiksCiAgICAgICAgIHF1ZXN0aW9uID0gZ3N1YigiIFxcKGZvcl9leGFtcGxlLF9zbW9vdGgsX3JvdWdoXFwpIiwgIiIsIHF1ZXN0aW9uKSkKYGBgCgpgYGB7cn0KIyByZW5hbWUgcXVlc3Rpb25zCmQxIDwtIGQwICU+JQogICMgZ2V0IHJpZCBvZiBleHRyYSBpbmZvIGluIGZpcnN0IHR3byByb3dzICAKICBmaWx0ZXIoIWlzLm5hKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKFEyKSkpKSAlPiUgCiAgZ2F0aGVyKHF1ZXN0aW9uX3F1YWx0cmljcywgcmVzcG9uc2UsIC1jKFJlc3BvbnNlSWQsIGR1cGxpY2F0ZUdQUykpICU+JQogIGxlZnRfam9pbihxdWVzdGlvbl9rZXkgJT4lIHNlbGVjdChxdWVzdGlvbl9xdWFsdHJpY3MsIHF1ZXN0aW9uKSkgJT4lCiAgc2VsZWN0KC1xdWVzdGlvbl9xdWFsdHJpY3MpICU+JQogIHNwcmVhZChxdWVzdGlvbiwgcmVzcG9uc2UpCmBgYAoKYGBge3J9CiMgaW1wbGVtZW50IGluY2x1c2lvbi9leGNsdXNpb24gY3JpdGVyaWEKZDIgPC0gZDEgJT4lCiAgZmlsdGVyKEFnZSA+PSAxOCwgQWdlIDw9IDQ1LAogICAgICAgICBFbmdsaXNoUHJvZiAlaW4lIGMoIkFkdmFuY2VkIiwgIlN1cGVyaW9yIiksCiAgICAgICAgIGB0YXJnZXQwMG1vX3BsZWFzZV9zZWxlY3RfMzRgID09IDM0LAogICAgICAgICBgdGFyZ2V0MDltb19wbGVhc2Vfc2VsZWN0XzkwYCA9PSA5MCwKICAgICAgICAgYHRhcmdldDYwbW9fcGxlYXNlX3NlbGVjdF80YCA9PSA0LAogICAgICAgICBBdHRlbnRpb24gPT0gIlllcyIpCmBgYAoKYGBge3J9CiMgcmVtb3ZlIHBlb3BsZSB3aXRoIGFub3RoZXIgaWRlbnRpY2FsIHNldCBvZiBHUFMgY29vcmRpbmF0ZXMgYW1vbmcgcGVvcGxlIHdobyBwYXNzZWQgYXR0ZW50aW9uIGNoZWNrcyBBUyBERVNJUkVECmQzIDwtIGQyICU+JQogICMgZmlsdGVyKGR1cGxpY2F0ZUdQUyA9PSBGKSAlPiUKICBzZWxlY3QoLWR1cGxpY2F0ZUdQUykKYGBgCgoKYGBge3J9CiMgcmVjb2RlIHZhcmlhYmxlcyAmIGRyb3AgZXh0cmFuZW91cyB2YXJpYWJsZXMKZDQgPC0gZDMgJT4lCiAgc2VsZWN0KC1jKEVuZERhdGUsIEZpbmlzaGVkLCAKICAgICAgICAgICAgcGF5bWVudCwgUHJvZ3Jlc3MsIAogICAgICAgICAgICBSZWNvcmRlZERhdGUsIFN0YXJ0RGF0ZSwgU3RhdHVzLCAKICAgICAgICAgICAgdGltZUVzdGltYXRlLCBVc2VyTGFuZ3VhZ2UpKSAlPiUKICBtdXRhdGVfYXQodmFycyhjKHN0YXJ0c193aXRoKCJ0YXJnZXQiKSwgQWdlLCBDaGlsZHJlbk51bWJlciwgCiAgICAgICAgICAgICAgICAgICBDaGlsZHJlbk9sZGVzdEFnZV9maWxsSW4xLCBDaGlsZHJlbk9sZGVzdEFnZV9maWxsSW4yLCAKICAgICAgICAgICAgICAgICAgIENoaWxkcmVuWW91bmdlc3RBZ2VfZmlsbEluMSwgQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9maWxsSW4yLAogICAgICAgICAgICAgICAgICAgRHVyYXRpb24sIEhvdXNlaG9sZFNpemUpKSwKICAgICAgICAgICAgZnVucyhhcy5udW1lcmljKC4pKSkgJT4lCiAgbXV0YXRlKEVkdWNhdGlvbiA9IGZhY3RvcihFZHVjYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJObyBzY2hvb2xpbmcgY29tcGxldGVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdXJzZXJ5IHNjaG9vbCB0byA4dGggZ3JhZGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvbWUgaGlnaCBzY2hvb2wsIG5vIGRpcGxvbWEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhpZ2ggc2Nob29sIGdyYWR1YXRlLCBkaXBsb21hIG9yIGVxdWl2YWxlbnQgKGluY2x1ZGluZyBHRUQpIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb21lIGNvbGxlZ2UgY3JlZGl0LCBubyBkZWdyZWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyYWRlIHNjaG9vbCwgdGVjaG5pY2FsIHNjaG9vbCwgb3Igdm9jYXRpb25hbCBzY2hvb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXNzb2NpYXRlJ3MgZGVncmVlIChmb3IgZXhhbXBsZSwgQUEsIEFTKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWNoZWxvcidzIGRlZ3JlZSAoZm9yIGV4YW1wbGUsIEJBLCBCUykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFzdGVyJ3MgZGVncmVlIChmb3IgZXhhbXBsZSwgTUEsIE1TKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEb2N0b3Igb3IgcHJvZmVzc2lvbmFsIGRlZ3JlZSAoZm9yIGV4YW1wbGUsIFBoRCwgSkQsIE1ELCBNQkEpIikpLAogICAgICAgICBJbmNvbWUgPSBmYWN0b3IoSW5jb21lLAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiJDUsMDAxIC0gMTUsMDAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkMTUsMDAxIC0gMzAsMDAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkMzAsMDAxIC0gNjAsMDAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiQ2MCwwMDEgLSA5MCwwMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJDkwLDAwMSAtIDE1MCwwMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR3JlYXRlciB0aGFuICQxNTAsMDAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZWZlciBub3QgdG8gc2F5IikpLAogICAgICAgICBQYXJlbnQgPSBmYWN0b3IoUGFyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTm8iLCAiWWVzIikpKQpgYGAKCmBgYHtyfQojIG1ha2UgdXNlZnVsIGRhdGFzZXRzCiMgZmluYWwgZGF0YXNldCB3aXRoIGFsbCBtZWFzdXJlZCB2YXJpYWJsZXMKZCA8LSBkNCAlPiUgZGlzdGluY3QoKQoKIyBkZW1vZ3JhcGhpYyBpbmZvcm1hdGlvbgpkX2RlbW8gPC0gZCAlPiUgCiAgc2VsZWN0KFJlc3BvbnNlSWQsIER1cmF0aW9uLAogICAgICAgICBBZ2UsIHN0YXJ0c193aXRoKCJHZW5kZXJTZXgiKSwgc3RhcnRzX3dpdGgoIlJhY2VFdGhuaWNpdHkiKSwKICAgICAgICAgc3RhcnRzX3dpdGgoIkZpcnN0TGFuZyIpLAogICAgICAgICBFZHVjYXRpb24sIEluY29tZSwgSG91c2Vob2xkU2l6ZSwKICAgICAgICAgc3RhcnRzX3dpdGgoIk1hcml0YWxTdGF0dXMiKSwKICAgICAgICAgUGFyZW50LCBzdGFydHNfd2l0aCgiQ2hpbGRyZW4iKSwgCiAgICAgICAgIENvbW1lbnRzKSAlPiUKICBtdXRhdGUoUmFjZUV0aG5pY2l0eV9jb2xsYXBzZSA9IGlmZWxzZShncmVwbCgiLChbQS1aYS16XSkiLCBSYWNlRXRobmljaXR5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXVsdGlwbGUiLCBSYWNlRXRobmljaXR5KSkgJT4lCiAgbXV0YXRlKENoaWxkcmVuT2xkZXN0QWdlX2NvbGxhcHNlID0gY2FzZV93aGVuKAogICAgQ2hpbGRyZW5PbGRlc3RBZ2UgJWluJSBjKCJNeSBvbGRlc3QgY2hpbGQgaGFzIG5vdCB5ZXQgYmVlbiBib3JuIChJIGFtL215IHBhcnRuZXIgaXMgcHJlZ25hbnQpIiwgIk15IG9sZGVzdCBjaGlsZCBpcyBkZWNlYXNlZCIsICJQcmVmZXIgbm90IHRvIHNheSIpIH4gQ2hpbGRyZW5PbGRlc3RBZ2UsCiAgICBDaGlsZHJlbk9sZGVzdEFnZSA9PSAiSW4gbW9udGhzOiIgfiAKICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5PbGRlc3RBZ2VfZmlsbEluMSkvMTIgPCAxLAogICAgICAgICAgICAgIjwgMSB5ZWFyIiwKICAgICAgICAgICAgIGlmZWxzZShhcy5udW1lcmljKENoaWxkcmVuT2xkZXN0QWdlX2ZpbGxJbjEpLzEyIDwgMywgCiAgICAgICAgICAgICAgICAgICAgIjEgLSAzIHllYXJzIiwKICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYXMubnVtZXJpYyhDaGlsZHJlbk9sZGVzdEFnZV9maWxsSW4xKS8xMiA8IDUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAiMyAtIDUgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYXMubnVtZXJpYyhDaGlsZHJlbk9sZGVzdEFnZV9maWxsSW4xKS8xMiA8IDEwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1IC0gMTAgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5PbGRlc3RBZ2VfZmlsbEluMSkvMTIgPCAxOCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwIC0gMTggeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+IDE4IHllYXJzIikpKSkpLAogICAgQ2hpbGRyZW5PbGRlc3RBZ2UgPT0gIkluIHllYXJzOiIgfgogICAgICBpZmVsc2UoYXMubnVtZXJpYyhDaGlsZHJlbk9sZGVzdEFnZV9maWxsSW4yKSA8IDEsCiAgICAgICAgICAgICAiPCAxIHllYXIiLAogICAgICAgICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5PbGRlc3RBZ2VfZmlsbEluMikgPCAzLCAKICAgICAgICAgICAgICAgICAgICAiMSAtIDMgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgIGlmZWxzZShhcy5udW1lcmljKENoaWxkcmVuT2xkZXN0QWdlX2ZpbGxJbjIpIDwgNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIC0gNSB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShhcy5udW1lcmljKENoaWxkcmVuT2xkZXN0QWdlX2ZpbGxJbjIpIDwgMTAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUgLSAxMCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYXMubnVtZXJpYyhDaGlsZHJlbk9sZGVzdEFnZV9maWxsSW4yKSA8IDE4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAgLSAxOCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj4gMTggeWVhcnMiKSkpKSksCiAgICBUUlVFIH4gIk5BIikpICU+JQogIG11dGF0ZShDaGlsZHJlbk9sZGVzdEFnZV9jb2xsYXBzZSA9IAogICAgICAgICAgIGZhY3RvcihDaGlsZHJlbk9sZGVzdEFnZV9jb2xsYXBzZSwKICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTXkgb2xkZXN0IGNoaWxkIGhhcyBub3QgeWV0IGJlZW4gYm9ybiAoSSBhbS9teSBwYXJ0bmVyIGlzIHByZWduYW50KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwgMSB5ZWFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMSAtIDMgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIC0gNSB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUgLSAxMCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwIC0gMTggeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+IDE4IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXkgb2xkZXN0IGNoaWxkIGlzIGRlY2Vhc2VkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJlZmVyIG5vdCB0byBzYXkiKSkpICU+JQogIG11dGF0ZShDaGlsZHJlbllvdW5nZXN0QWdlX2NvbGxhcHNlID0gY2FzZV93aGVuKAogICAgQ2hpbGRyZW5Zb3VuZ2VzdEFnZSAlaW4lIGMoIk15IHlvdW5nZXN0IGNoaWxkIGhhcyBub3QgeWV0IGJlZW4gYm9ybiAoSSBhbS9teSBwYXJ0bmVyIGlzIHByZWduYW50KSIsICJNeSB5b3VuZ2VzdCBjaGlsZCBpcyBkZWNlYXNlZCIsICJQcmVmZXIgbm90IHRvIHNheSIpIH4gQ2hpbGRyZW5Zb3VuZ2VzdEFnZSwKICAgIENoaWxkcmVuWW91bmdlc3RBZ2UgPT0gIkluIG1vbnRoczoiIH4gCiAgICAgIGlmZWxzZShhcy5udW1lcmljKENoaWxkcmVuWW91bmdlc3RBZ2VfZmlsbEluMSkvMTIgPCAxLAogICAgICAgICAgICAgIjwgMSB5ZWFyIiwKICAgICAgICAgICAgIGlmZWxzZShhcy5udW1lcmljKENoaWxkcmVuWW91bmdlc3RBZ2VfZmlsbEluMSkvMTIgPCAzLCAKICAgICAgICAgICAgICAgICAgICAiMSAtIDMgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgIGlmZWxzZShhcy5udW1lcmljKENoaWxkcmVuWW91bmdlc3RBZ2VfZmlsbEluMSkvMTIgPCA1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMgLSA1IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9maWxsSW4xKS8xMiA8IDEwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1IC0gMTAgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9maWxsSW4xKS8xMiA8IDE4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAgLSAxOCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj4gMTggeWVhcnMiKSkpKSksCiAgICBDaGlsZHJlbllvdW5nZXN0QWdlID09ICJJbiB5ZWFyczoiIH4KICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9maWxsSW4yKSA8IDEsCiAgICAgICAgICAgICAiPCAxIHllYXIiLAogICAgICAgICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9maWxsSW4yKSA8IDMsIAogICAgICAgICAgICAgICAgICAgICIxIC0gMyB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9maWxsSW4yKSA8IDUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAiMyAtIDUgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYXMubnVtZXJpYyhDaGlsZHJlbllvdW5nZXN0QWdlX2ZpbGxJbjIpIDwgMTAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUgLSAxMCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYXMubnVtZXJpYyhDaGlsZHJlbllvdW5nZXN0QWdlX2ZpbGxJbjIpIDwgMTgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMCAtIDE4IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPiAxOCB5ZWFycyIpKSkpKSwKICAgIFRSVUUgfiAiTkEiKSkgJT4lCiAgbXV0YXRlKENoaWxkcmVuWW91bmdlc3RBZ2VfY29sbGFwc2UgPSAKICAgICAgICAgICBmYWN0b3IoQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9jb2xsYXBzZSwKICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTXkgWW91bmdlc3QgY2hpbGQgaGFzIG5vdCB5ZXQgYmVlbiBib3JuIChJIGFtL215IHBhcnRuZXIgaXMgcHJlZ25hbnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPCAxIHllYXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxIC0gMyB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMgLSA1IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNSAtIDEwIHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAgLSAxOCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj4gMTggeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNeSBZb3VuZ2VzdCBjaGlsZCBpcyBkZWNlYXNlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZWZlciBub3QgdG8gc2F5IikpKSAgCiMgYWxsIGFzc2Vzc21lbnRzIG9mIEFMTCBUQVJHRVRTLCBSZXBzb25zZUlkIGFzIHJvd25hbWVzCmRfYWxsIDwtIGQgJT4lIAogIHNlbGVjdChSZXNwb25zZUlkLCBzdGFydHNfd2l0aCgidGFyZ2V0IiksIC1jb250YWlucygicGxlYXNlX3NlbGVjdCIpKSAlPiUKICBnYXRoZXIocXVlc3Rpb24sIHJlc3BvbnNlLCAtUmVzcG9uc2VJZCkgJT4lCiAgbXV0YXRlKHRhcmdldCA9IGdzdWIoIl8uKiQiLCAiIiwgcXVlc3Rpb24pLAogICAgICAgICBjYXBhY2l0eSA9IGdzdWIoInRhcmdldC4ubW9fIiwgIiIsIHF1ZXN0aW9uKSwKICAgICAgICAgc3ViaWQgPSBwYXN0ZShSZXNwb25zZUlkLCB0YXJnZXQsIHNlcCA9ICJfIikpICU+JQogIHNlbGVjdCgtUmVzcG9uc2VJZCwgLXF1ZXN0aW9uLCAtdGFyZ2V0KSAlPiUKICBzcHJlYWQoY2FwYWNpdHksIHJlc3BvbnNlKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkIikKCiMgYWxsIGFzc2Vzc21lbnRzIG9mIE5FV0JPUk5TLCBSZXBzb25zZUlkIGFzIHJvd25hbWVzCmRfMDBtbyA8LSBkX2FsbCAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JQogIGZpbHRlcihncmVwbCgidGFyZ2V0MDBtbyIsIHN1YmlkKSkgJT4lCiAgbXV0YXRlKHN1YmlkID0gZ3N1YigidGFyZ2V0Li5tb18iLCAiIiwgc3ViaWQpKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkIikKCiMgYWxsIGFzc2Vzc21lbnRzIG9mIDktTU9OVEgtT0xEUywgUmVwc29uc2VJZCBhcyByb3duYW1lcwpkXzA5bW8gPC0gZF9hbGwgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSAlPiUKICBmaWx0ZXIoZ3JlcGwoInRhcmdldDA5bW8iLCBzdWJpZCkpICU+JQogIG11dGF0ZShzdWJpZCA9IGdzdWIoInRhcmdldC4ubW9fIiwgIiIsIHN1YmlkKSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJzdWJpZCIpCgojIGFsbCBhc3Nlc3NtZW50cyBvZiA1LVlFQVItT0xEUywgUmVwc29uc2VJZCBhcyByb3duYW1lcwpkXzYwbW8gPC0gZF9hbGwgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSAlPiUKICBmaWx0ZXIoZ3JlcGwoInRhcmdldDYwbW8iLCBzdWJpZCkpICU+JQogIG11dGF0ZShzdWJpZCA9IGdzdWIoInRhcmdldC4ubW9fIiwgIiIsIHN1YmlkKSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJzdWJpZCIpCmBgYAoKCiMgRUZBOiBhbGwgdGFyZ2V0cwoKT3VyIHByaW1hcnkgYW5hbHlzaXMgaXMgYW4gZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzIChFRkEpIGNvbGxhcHNpbmcgYWNyb3NzIGFsbCAzIHRhcmdldCBjaGFyYWN0ZXJzIChhbmQgdHJlYXRpbmcgYW4gaW5kaXZpZHVhbCBwYXJ0aWNpcGFudCdzIHJlc3BvbnNlcyB0byBlYWNoIGNoYXJhY3RlciBhcyBpZiB0aGV5IHdlcmUgaW5kZXBlbmRlbnQgZGF0YSBwb2ludHMpIC0gc2VlIHRoZSBwcmVyZWdpc3RyYXRpb24gZm9yIG1vcmUgZGV0YWlscy4gIAoKV2UgcGxhbm5lZCB0byBleGFtaW5lIHRocmVlIGZhY3RvciByZXRlbnRpb24gcHJvdG9jb2xzIGluIG9yZGVyIHRvIGRldGVybWluZSBob3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbjogUGFyYWxsZWwgYW5hbHlzaXMsIG1pbmltaXppbmcgQklDLCBhbmQgYSBzZXQgb2YgcHJlc2V0IGNyaXRlcmlhIG91dGxpbmVkIGluIFdlaXNtYW4gZXQgYWwuICgyMDE3KS4gSGVyZSB3ZSBsb29rIGF0IGVhY2ggc29sdXRpb24gaW4gdHVybi4KCiMjIFJvdGF0aW9uIGNob2ljZXMKCldlIHBsYW5uZWQgdG8gZXhhbWluZSBvYmxpbWluLXJvdGF0ZWQgc29sdXRpb25zICh3aGljaCBhbGxvdyBmYWN0b3JzIHRvIGNvcnJlbGF0ZSksIGJ1dCB5b3UgY291bGQgZXhhbWluZSBvdGhlciByb3RhdGlvbiBvcHRpb25zIGJ5IHNlbGVjdGluZyBhIGRpZmZlcmVudCByb3RhdGlvbiB0eXBlIGhlcmUuCgpgYGB7cn0KY2hvc2VuX3JvdCA8LSAib2JsaW1pbiIgIyBwcmVyZWdpc3RlcmVkOiBmYWN0b3JzIGFsbG93ZWQgdG8gY29ycmVsYXRlCiMgY2hvc2VuX3JvdCA8LSAidmFyaW1heCIgIyBvcnRob2dvbmFsOiBmYWN0b3JzIGZvcmNlZCBub3QgdG8gY29ycmVsYXRlCiMgY2hvc2VuX3JvdCA8LSAibm9uZSIgIyBubyByb3RhdGlvbgpgYGAKCgojIyBQYXJhbGxlbCBhbmFseXNpcwoKIyMjIEhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluPwoKYGBge3J9CnJldGVuX2FsbF9QQSA8LSBmYS5wYXJhbGxlbChkX2FsbCwgcGxvdCA9IEYpOyByZXRlbl9hbGxfUEEKcmV0ZW5fYWxsX3BhciA8LSByZXRlbl9hbGxfUEEkbmZhY3QKYGBgCgojIyMgV2hhdCBhcmUgdGhlc2UgZmFjdG9ycz8KCmBgYHtyfQplZmFfYWxsX3BhciA8LSBmYShkX2FsbCwgbmZhY3RvcnMgPSByZXRlbl9hbGxfcGFyLCByb3RhdGUgPSBjaG9zZW5fcm90LAogICAgICAgICAgICAgICAgICBzY29yZXMgPSAidGVuQmVyZ2UiLCBpbXB1dGUgPSAibWVkaWFuIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDEuNSwgaW5jbHVkZSA9IFR9CmhlYXRtYXBfZnVuKGVmYV9hbGxfcGFyKSArIAogIGxhYnModGl0bGUgPSBwYXN0ZTAoIlBhcmFsbGVsIEFuYWx5c2lzIChyb3RhdGlvbjogIiwgY2hvc2VuX3JvdCwgIikiKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNC41LCBmaWcuYXNwID0gMS4yNSwgaW5jbHVkZSA9IEZ9CmhlYXRtYXBfZnVuKGVmYV9hbGxfcGFyLCBmYWN0b3JfbmFtZXMgPSBjKCJDb2duaXRpb24gYW5kIGNvbnRyb2wiLCAiQm9kaWx5IHNlbnNhdGlvbnMiLCAiU29jaWFsIGNvbm5lY3Rpb24iLCAiTmVnYXRpdmUgYWZmZWN0IikpICsgCiAgbGFicyh0aXRsZSA9ICJTdHVkeSAxOiBGYWN0b3IgbG9hZGluZ3MgZnJvbSBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMgKEVGQSkiLAogICAgICAgc3VidGl0bGUgPSAiRm91ci1mYWN0b3Igc29sdXRpb24gc3VnZ2VzdGVkIGJ5IHBhcmFsbGVsIGFuYWx5c2lzLCBhZnRlciBvYmxpcXVlIHRyYW5zZm9ybWF0aW9uIChvYmxpbWluKSIpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGfQojIGNyb3NzLWxvYWRpbmdzCmVmYV9hbGxfcGFyJGxvYWRpbmdzW10gJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiY2FwYWNpdHkiKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBsb2FkaW5nLCAtY2FwYWNpdHkpICU+JQogIGZpbHRlcihhYnMobG9hZGluZykgPiAwLjQpICU+JSAKICBjb3VudChjYXBhY2l0eSkgJT4lCiAgZmlsdGVyKG4gPiAxKSAlPiUKICBzZWxlY3QoLW4pICU+JQogIGxlZnRfam9pbihlZmFfYWxsX3BhciRsb2FkaW5nc1tdICU+JQogICAgICAgICAgICAgIGRhdGEuZnJhbWUoKSAlPiUKICAgICAgICAgICAgICByb3duYW1lc190b19jb2x1bW4oImNhcGFjaXR5IikgJT4lCiAgICAgICAgICAgICAgZ2F0aGVyKGZhY3RvciwgbG9hZGluZywgLWNhcGFjaXR5KSAlPiUKICAgICAgICAgICAgICBmaWx0ZXIoYWJzKGxvYWRpbmcpID4gMC40KSAlPiUKICAgICAgICAgICAgICBtdXRhdGUobG9hZGluZyA9IHJvdW5kKGxvYWRpbmcsIDMpKSAlPiUKICAgICAgICAgICAgICBzcHJlYWQoZmFjdG9yLCBsb2FkaW5nKSkgJT4lCiAgcmVuYW1lKENPRyA9IE1SMSwgQk9EID0gTVIyLCBQT1MgPSBNUjMsIE5FRyA9IE1SNCkKYGBgCgpgYGB7cn0KIyBpbnRlcmZhY3RvciBjb3JyZWxhdGlvbnMKZWZhX2FsbF9wYXIkUGhpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oImZhY3RvckEiKSAlPiUKICBnYXRoZXIoZmFjdG9yQiwgcGhpLCAtZmFjdG9yQSkgJT4lCiAgYXJyYW5nZShkZXNjKHBoaSkpCmBgYAoKYGBge3J9CmVmYV9hbGxfcGFyJGxvYWRpbmdzW10gJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiY2FwYWNpdHkiKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBsb2FkaW5nLCAtY2FwYWNpdHkpICU+JQogICMgZ3JvdXBfYnkoY2FwYWNpdHkpICU+JQogICMgdG9wX24oMSwgYWJzKGxvYWRpbmcpKSAlPiUKICAjIHVuZ3JvdXAoKSAlPiUKICBmaWx0ZXIoYWJzKGxvYWRpbmcpID49IDAuNikgJT4lCiAgY291bnQoZmFjdG9yKQoKZWZhX2FsbF9wYXIkbG9hZGluZ3NbXSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJjYXBhY2l0eSIpICU+JQogIHNlbGVjdChjYXBhY2l0eSwgTVI0KSAlPiUKICBhcnJhbmdlKGRlc2MoYWJzKE1SNCkpKQpgYGAKCgojIyMgV2hpY2ggY2FwYWNpdGllcyBhcmUgYXR0cmlidXRlZCB0byB3aGljaCB0YXJnZXRzPwoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjYsIGluY2x1ZGUgPSBUfQpzY29yZXNwbG90X2Z1bihlZmFfYWxsX3BhciwgdGFyZ2V0ID0gImFsbCAoc3R1ZHkgMSkiKSArIAogIGxhYnModGl0bGUgPSAiUGFyYWxsZWwgQW5hbHlzaXMiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQpgYGAKCkhlcmUncyBhIG11bHRpbGV2ZWwgbGluZWFyIHJlZ3Jlc3Npb24gb24gdGhlc2UgZmFjdG9yIHNjb3Jlcywgd2l0aCByYW5kb20gaW50ZXJjZXB0cyBhbmQgc2xvcGVzIChmb3IgdGFyZ2V0IGFuZCBmYWN0b3IpIGJ5IHBhcnRpY2lwYW50LiBUYXJnZXQgaXMgY29kZWQgd2l0aCBsaW5lYXIgYW5kIHF1YWRyYXRpYyBjb250cmFzdHMsIGFuZCBmYWN0b3IgaXMgZWZmZWN0LWNvZGVkIGZvciBjb21wYXJpc29uIHdpdGggdGhlIGdyYW5kIG1lYW4gKHdpdGggdGhlIGxhc3QgZmFjdG9yIGFzIHRoZSBiYXNlLCAtMSk6CgpgYGB7ciwgaW5jbHVkZSA9IFR9CmVmYV9hbGxfcGFyX3Njb3JlcyA8LSBlZmFfYWxsX3BhciRzY29yZXNbXSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JQogIG11dGF0ZSh0YXJnZXQgPSBnc3ViKCJeLipfdGFyZ2V0IiwgInRhcmdldCIsIHN1YmlkKSwKICAgICAgICAgUmVzcG9uc2VJZCA9IGdzdWIoIl90YXJnZXQuKiQiLCAiIiwgc3ViaWQpKSAlPiUKICBzZWxlY3QoLXN1YmlkKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBzY29yZSwgLXRhcmdldCwgLVJlc3BvbnNlSWQpICU+JQogIG11dGF0ZV9hdCh2YXJzKHRhcmdldCwgZmFjdG9yKSwgZnVucyhmYWN0b3IpKQoKY29udHJhc3RzKGVmYV9hbGxfcGFyX3Njb3JlcyR0YXJnZXQpIDwtIGNvbnRyLnBvbHkoMykKY29udHJhc3RzKGVmYV9hbGxfcGFyX3Njb3JlcyRmYWN0b3IpIDwtIGNvbnRyLnN1bShyZXRlbl9hbGxfcGFyKQoKcl9hbGxfcGFyIDwtIGxtZXIoc2NvcmUgfiB0YXJnZXQgKiBmYWN0b3IgKyAodGFyZ2V0ICsgZmFjdG9yIHwgUmVzcG9uc2VJZCksCiAgICAgICAgICAgICAgICAgIGVmYV9hbGxfcGFyX3Njb3JlcykKc3VtbWFyeShyX2FsbF9wYXIsIGNvcnIgPSBGKQpgYGAKCklmIHdlIGNvbnNpZGVyIHQtdmFsdWVzID4gMiB0byBiZSAic2lnbmlmaWNhbnQiIGFuZCB1c2UgdGhlIHBsb3QgYWJvdmUgdG8gZ3VpZGUgb3VyIGludGVycHJldGF0aW9uLCBoZXJlJ3Mgd2hhdCB3ZSBjb25jbHVkZToKCi0gW2AoSW50ZXJjZXB0KWA6IEJ5IGRlZmluaXRpb24sIGJlY2F1c2Ugd2UncmUgdXNpbmcgZmFjdG9yIHNjb3Jlcywgd2hpY2ggYXJlIHNpbWlsYXIgdG8gei1zY29yZXMsIHRoZSBpbnRlcmNlcHQgaXMgfjAuXQotIGB0YXJnZXQuTGA6IE92ZXJhbGwsIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgaW5jcmVhc2Ugd2l0aCB0YXJnZXQgYWdlLgotIGB0YXJnZXQuUWA6IFRoaXMgaW5jcmVhc2UgaXMgZ2VuZXJhbGx5IG5vbi1saW5lYXIuCi0gW2BmYWN0b3IxYCwgYGZhY3RvcjJgLCAuLi46IEJ5IGRlZmluaXRpb24sIGJlY2F1c2Ugd2UncmUgdXNpbmcgZmFjdG9yIHNjb3Jlcywgd2hpY2ggYXJlIHNpbWlsYXIgdG8gei1zY29yZXMsIHRoZSBkaWZmZXJlbmNlcyBpbiBtZWFucyBhY3Jvc3MgZmFjdG9ycyBhcmUgfjAuXQotIGB0YXJnZXQuTDpmYWN0b3IxYDogVGhlIGxpbmVhciBpbmNyZWFzZSBpcyBtb3JlIGRyYW1hdGljIChzdGVlcGVyIHNsb3BlKSBmb3IgTVIxLCBjb21wYXJlZCB0byBvdGhlciBmYWN0b3JzLiAKLSBgdGFyZ2V0LlE6ZmFjdG9yMWA6IFRoZSBub25saW5lYXJpdHkgaXMgbW9yZSBkcmFtYXRpYyAoY3VydmllciBhbmQvb3IgY29uY2F2ZSBpbnN0ZWFkIG9mIGNvbnZleCBjdXJ2ZSkgZm9yIE1SMSwgY29tcGFyZWQgdG8gb3RoZXIgZmFjdG9ycy4gCi0gYHRhcmdldC5MOmZhY3RvcjJgOiBUaGUgbGluZWFyIGluY3JlYXNlIGlzIGxlc3MgZHJhbWF0aWMgKHNoYWxsb3dlciBzbG9wZSkgZm9yIE1SMiwgY29tcGFyZWQgdG8gb3RoZXIgZmFjdG9ycy4gCi0gYHRhcmdldC5ROmZhY3RvcjJgOiBUaGUgbm9ubGluZWFyaXR5IGlzIGxlc3MgZHJhbWF0aWMgKGZsYXR0ZXIgY3VydmUpIGZvciBNUjIsIGNvbXBhcmVkIHRvIG90aGVyIGZhY3RvcnMuIAotIGB0YXJnZXQuTDpmYWN0b3IzYDogVGhlIGxpbmVhciBpbmNyZWFzZSBpcyBtb3JlIGRyYW1hdGljIChzdGVlcGVyIHNsb3BlKSBmb3IgTVIzLCBjb21wYXJlZCB0byBvdGhlciBmYWN0b3JzLiAKLSBgdGFyZ2V0LlE6ZmFjdG9yM2A6IFRoZSBub25saW5lYXJpdHkgaXMgbGVzcyBkcmFtYXRpYyAoZmxhdHRlciBjdXJ2ZSkgZm9yIE1SMywgY29tcGFyZWQgdG8gb3RoZXIgZmFjdG9ycy4gCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDEsIGluY2x1ZGUgPSBUfQppdGVtc3Bsb3RfZnVuKGVmYV9hbGxfcGFyLCB0YXJnZXQgPSAiYWxsIikgKyAKICBsYWJzKHRpdGxlID0gIlBhcmFsbGVsIEFuYWx5c2lzIikKYGBgCgoKIyMgTWluaW1pemluZyBCSUMKCiMjIyBIb3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbj8KCmBgYHtyfQpyZXRlbl9hbGxfdnNzIDwtIFZTUyhkX2FsbCwgcGxvdCA9IEYpOyByZXRlbl9hbGxfdnNzCnJldGVuX2FsbF9iaWMgPC0gZGF0YS5mcmFtZShyZXRlbl9hbGxfdnNzJHZzcy5zdGF0cyAlPiUKICByb3duYW1lc190b19jb2x1bW4oIm5mYWN0b3JzIikgJT4lCiAgdG9wX24oLTEsIEJJQykgJT4lCiAgc2VsZWN0KG5mYWN0b3JzKSkkbmZhY3RvcnMgJT4lIGFzLm51bWVyaWMoKQpgYGAKCiMjIyBXaGF0IGFyZSB0aGVzZSBmYWN0b3JzPwoKYGBge3J9CmVmYV9hbGxfYmljIDwtIGZhKGRfYWxsLCBuZmFjdG9ycyA9IHJldGVuX2FsbF9iaWMsIHJvdGF0ZSA9IGNob3Nlbl9yb3QsCiAgICAgICAgICAgICAgICAgIHNjb3JlcyA9ICJ0ZW5CZXJnZSIsIGltcHV0ZSA9ICJtZWRpYW4iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMS41LCBpbmNsdWRlID0gVH0KaGVhdG1hcF9mdW4oZWZhX2FsbF9iaWMpICsgCiAgbGFicyh0aXRsZSA9IHBhc3RlMCgiTWluaW1pemluZyBCSUMgKHJvdGF0aW9uOiAiLCBjaG9zZW5fcm90LCAiKSIpKQpgYGAKCiMjIyBXaGljaCBjYXBhY2l0aWVzIGFyZSBhdHRyaWJ1dGVkIHRvIHdoaWNoIHRhcmdldHM/CgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNiwgaW5jbHVkZSA9IFR9CnNjb3Jlc3Bsb3RfZnVuKGVmYV9hbGxfYmljLCB0YXJnZXQgPSAiYWxsIChzdHVkeSAxKSIpICsgCiAgbGFicyh0aXRsZSA9ICJNaW5pbWl6aW5nIEJJQyIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmBgYAoKSGVyZSdzIGEgbXVsdGlsZXZlbCBsaW5lYXIgcmVncmVzc2lvbiBvbiB0aGVzZSBmYWN0b3Igc2NvcmVzLCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzIGFuZCBzbG9wZXMgKGZvciB0YXJnZXQgYW5kIGZhY3RvcikgYnkgcGFydGljaXBhbnQuIFRhcmdldCBpcyBjb2RlZCB3aXRoIGxpbmVhciBhbmQgcXVhZHJhdGljIGNvbnRyYXN0cywgYW5kIGZhY3RvciBpcyBlZmZlY3QtY29kZWQgZm9yIGNvbXBhcmlzb24gd2l0aCB0aGUgZ3JhbmQgbWVhbiAod2l0aCB0aGUgbGFzdCBmYWN0b3IgYXMgdGhlIGJhc2UsIC0xKToKCmBgYHtyfQojIGVmYV9hbGxfYmljX3Njb3JlcyA8LSBlZmFfYWxsX2JpYyRzY29yZXNbXSAlPiUKIyAgIGRhdGEuZnJhbWUoKSAlPiUKIyAgIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSAlPiUKIyAgIG11dGF0ZSh0YXJnZXQgPSBnc3ViKCJeLipfdGFyZ2V0IiwgInRhcmdldCIsIHN1YmlkKSwKIyAgICAgICAgICBSZXNwb25zZUlkID0gZ3N1YigiX3RhcmdldC4qJCIsICIiLCBzdWJpZCkpICU+JQojICAgc2VsZWN0KC1zdWJpZCkgJT4lCiMgICBnYXRoZXIoZmFjdG9yLCBzY29yZSwgLXRhcmdldCwgLVJlc3BvbnNlSWQpICU+JQojICAgbXV0YXRlX2F0KHZhcnModGFyZ2V0LCBmYWN0b3IpLCBmdW5zKGZhY3RvcikpCiMgCiMgY29udHJhc3RzKGVmYV9hbGxfYmljX3Njb3JlcyR0YXJnZXQpIDwtIGNvbnRyLnBvbHkoMykKIyBjb250cmFzdHMoZWZhX2FsbF9iaWNfc2NvcmVzJGZhY3RvcikgPC0gY29udHIuc3VtKHJldGVuX2FsbF9iaWMpCiMgCiMgcl9hbGxfYmljIDwtIGxtZXIoc2NvcmUgfiB0YXJnZXQgKiBmYWN0b3IgKyAodGFyZ2V0ICsgZmFjdG9yIHwgUmVzcG9uc2VJZCksCiMgICAgICAgICAgICAgICAgICAgZWZhX2FsbF9iaWNfc2NvcmVzLAojICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAxMDAwMDApKSkKIyBzdW1tYXJ5KHJfYWxsX2JpYywgY29yciA9IEYpCmBgYAoKSWYgd2UgY29uc2lkZXIgdC12YWx1ZXMgPiAyIHRvIGJlICJzaWduaWZpY2FudCIgYW5kIHVzZSB0aGUgcGxvdCBhYm92ZSB0byBndWlkZSBvdXIgaW50ZXJwcmV0YXRpb24sIGhlcmUncyB3aGF0IHdlIGNvbmNsdWRlOgoKLSBbYChJbnRlcmNlcHQpYDogQnkgZGVmaW5pdGlvbiwgYmVjYXVzZSB3ZSdyZSB1c2luZyBmYWN0b3Igc2NvcmVzLCB3aGljaCBhcmUgc2ltaWxhciB0byB6LXNjb3JlcywgdGhlIGludGVyY2VwdCBpcyB+MC5dCi0gYHRhcmdldC5MYDogT3ZlcmFsbCwgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBpbmNyZWFzZSB3aXRoIHRhcmdldCBhZ2UuCi0gYHRhcmdldC5RYDogVGhpcyBpbmNyZWFzZSBpcyAqbm90KiBnZW5lcmFsbHkgbm9uLWxpbmVhci4KLSBbYGZhY3RvcjFgLCBgZmFjdG9yMmAsIC4uLjogQnkgZGVmaW5pdGlvbiwgYmVjYXVzZSB3ZSdyZSB1c2luZyBmYWN0b3Igc2NvcmVzLCB3aGljaCBhcmUgc2ltaWxhciB0byB6LXNjb3JlcywgdGhlIGRpZmZlcmVuY2VzIGluIG1lYW5zIGFjcm9zcyBmYWN0b3JzIGFyZSB+MC5dCi0gYHRhcmdldC5MOmZhY3RvcjFgOiBUaGUgbGluZWFyIGluY3JlYXNlIGlzIG1vcmUgZHJhbWF0aWMgKHN0ZWVwZXIgc2xvcGUpIGZvciBNUjEsIGNvbXBhcmVkIHRvIG90aGVyIGZhY3RvcnMuIAotIGB0YXJnZXQuUTpmYWN0b3IxYDogVGhlIG5vbmxpbmVhcml0eSBpcyBtb3JlIGRyYW1hdGljIChjdXJ2aWVyIGFuZC9vciBjb25jYXZlIGluc3RlYWQgb2YgY29udmV4IGN1cnZlKSBmb3IgTVIxLCBjb21wYXJlZCB0byBvdGhlciBmYWN0b3JzLiAKLSBgdGFyZ2V0Lkw6ZmFjdG9yMmA6IFRoZSBsaW5lYXIgaW5jcmVhc2UgaXMgbGVzcyBkcmFtYXRpYyAoc2hhbGxvd2VyIHNsb3BlKSBmb3IgTVIyLCBjb21wYXJlZCB0byBvdGhlciBmYWN0b3JzLiAKLSBgdGFyZ2V0LlE6ZmFjdG9yMmA6IFRoZSBub25saW5lYXJpdHkgZm9yIE1SMiBpcyBjb21wYXJhYmxlIHRvIG90aGVyIGZhY3RvcnMuIAotIGB0YXJnZXQuTDpmYWN0b3IzYDogVGhlIGxpbmVhciBpbmNyZWFzZSBpcyBtb3JlIGRyYW1hdGljIChzdGVlcGVyIHNsb3BlKSBmb3IgTVIzLCBjb21wYXJlZCB0byBvdGhlciBmYWN0b3JzLiAKLSBgdGFyZ2V0LlE6ZmFjdG9yM2A6IFRoZSBub25saW5lYXJpdHkgaXMgbGVzcyBkcmFtYXRpYyAoZmxhdHRlciBjdXJ2ZSkgZm9yIE1SMywgY29tcGFyZWQgdG8gb3RoZXIgZmFjdG9ycy4gCi0gYHRhcmdldC5MOmZhY3RvcjRgOiBUaGUgbGluZWFyIGluY3JlYXNlIGlzIGxlc3MgZHJhbWF0aWMgKHNoYWxsb3dlciBzbG9wZSkgZm9yIE1SNCwgY29tcGFyZWQgdG8gb3RoZXIgZmFjdG9ycy4gCi0gYHRhcmdldC5ROmZhY3RvcjRgOiBUaGUgbm9ubGluZWFyaXR5IGlzIG1vcmUgZHJhbWF0aWMgKGN1cnZpZXIgYW5kL29yIGNvbmNhbnZlIGluc3RlYWQgb2YgY29udmV4IGN1cnZlKSBmb3IgTVI0LCBjb21wYXJlZCB0byBvdGhlciBmYWN0b3JzLiAKLSBgdGFyZ2V0Lkw6ZmFjdG9yNWA6IFRoZSBsaW5lYXIgaW5jcmVhc2UgaXMgbW9yZSBkcmFtYXRpYyAoc3RlZXBlciBzbG9wZSkgZm9yIE1SNSwgY29tcGFyZWQgdG8gb3RoZXIgZmFjdG9ycy4gCi0gYHRhcmdldC5ROmZhY3RvcjVgOiBUaGUgbm9ubGluZWFyaXR5IGlzIGxlc3MgZHJhbWF0aWMgKGZsYXR0ZXIgY3VydmUpIGZvciBNUjUsIGNvbXBhcmVkIHRvIG90aGVyIGZhY3RvcnMuIAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxLCBpbmNsdWRlID0gVH0KaXRlbXNwbG90X2Z1bihlZmFfYWxsX2JpYywgdGFyZ2V0ID0gImFsbCIpICsgCiAgbGFicyh0aXRsZSA9ICJNaW5pbWl6aW5nIEJJQyIpCmBgYAoKIyMjIEhvdyBkbyB0aGVzZSBjb21wYXJlIHRvIHBhcmFsbGVsIGFuYWx5c2lzPwoKYGBge3J9CmVmYV9hbGxfcGFyJGxvYWRpbmdzW10gJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiY2FwYWNpdHkiKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBsb2FkaW5nLCAtY2FwYWNpdHkpICU+JQogIGdyb3VwX2J5KGNhcGFjaXR5KSAlPiUKICB0b3BfbigxLCBhYnMobG9hZGluZykpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QoLWxvYWRpbmcpICU+JQogIHJlbmFtZShwYXJfZmFjdG9yID0gZmFjdG9yKSAlPiUKICBsZWZ0X2pvaW4oZWZhX2FsbF9iaWMkbG9hZGluZ3NbXSAlPiUKICAgICAgICAgICAgICBkYXRhLmZyYW1lKCkgJT4lCiAgICAgICAgICAgICAgcm93bmFtZXNfdG9fY29sdW1uKCJjYXBhY2l0eSIpICU+JQogICAgICAgICAgICAgIGdhdGhlcihmYWN0b3IsIGxvYWRpbmcsIC1jYXBhY2l0eSkgJT4lCiAgICAgICAgICAgICAgZ3JvdXBfYnkoY2FwYWNpdHkpICU+JQogICAgICAgICAgICAgIHRvcF9uKDEsIGFicyhsb2FkaW5nKSkgJT4lCiAgICAgICAgICAgICAgdW5ncm91cCgpICU+JQogICAgICAgICAgICAgIHNlbGVjdCgtbG9hZGluZykgJT4lCiAgICAgICAgICAgICAgcmVuYW1lKGtfZmFjdG9yID0gZmFjdG9yKSkgJT4lCiAgY291bnQocGFyX2ZhY3Rvciwga19mYWN0b3IpICU+JQogIHNwcmVhZChrX2ZhY3RvciwgbikKYGBgCgojIyBQcmVzZXQgcmV0ZW50aW9uIGNyaXRlcmlhCgojIyMgSG93IG1hbnkgZmFjdG9ycyB0byByZXRhaW4/CgpgYGB7cn0KcmV0ZW5fYWxsX2sgPC0gcmV0ZW5fZnVuKGRfYWxsLCByb3RfdHlwZSA9IGNob3Nlbl9yb3QpCnByaW50KHBhc3RlKCJQcmVzZXQgY3JpdGVyaWEgc3VnZ2VzdCByZXRhaW5pbmciLCByZXRlbl9hbGxfaywgImZhY3RvcnMiKSkKYGBgCgojIyMgV2hhdCBhcmUgdGhlc2UgZmFjdG9ycz8KCmBgYHtyfQplZmFfYWxsX2sgPC0gZmEoZF9hbGwsIG5mYWN0b3JzID0gcmV0ZW5fYWxsX2ssIHJvdGF0ZSA9IGNob3Nlbl9yb3QsCiAgICAgICAgICAgICAgICAgIHNjb3JlcyA9ICJ0ZW5CZXJnZSIsIGltcHV0ZSA9ICJtZWRpYW4iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMS41LCBpbmNsdWRlID0gVH0KaGVhdG1hcF9mdW4oZWZhX2FsbF9rKSArIAogIGxhYnModGl0bGUgPSBwYXN0ZTAoIlByZXNldCBjcml0ZXJpYSAocm90YXRpb246ICIsIGNob3Nlbl9yb3QsICIpIikpCmBgYAoKIyMjIFdoaWNoIGNhcGFjaXRpZXMgYXJlIGF0dHJpYnV0ZWQgdG8gd2hpY2ggdGFyZ2V0cz8KCmBgYHtyLCBpbmNsdWRlID0gVH0Kc2NvcmVzcGxvdF9mdW4oZWZhX2FsbF9rLCB0YXJnZXQgPSAiYWxsIChzdHVkeSAxKSIpICsgCiAgbGFicyh0aXRsZSA9ICJQcmVzZXQgZmFjdG9yIHJldGVudGlvbiBjcml0ZXJpYSAoV2Vpc21hbiBldCBhbC4sIDIwMTcpIikKYGBgCgpIZXJlJ3MgYSBtdWx0aWxldmVsIGxpbmVhciByZWdyZXNzaW9uIG9uIHRoZXNlIGZhY3RvciBzY29yZXMsIHdpdGggcmFuZG9tIGludGVyY2VwdHMgYW5kIHNsb3BlcyAoZm9yIHRhcmdldCBhbmQgZmFjdG9yKSBieSBwYXJ0aWNpcGFudC4gVGFyZ2V0IGlzIGNvZGVkIHdpdGggbGluZWFyIGFuZCBxdWFkcmF0aWMgY29udHJhc3RzLCBhbmQgZmFjdG9yIGlzIGVmZmVjdC1jb2RlZCBmb3IgY29tcGFyaXNvbiB3aXRoIHRoZSBncmFuZCBtZWFuICh3aXRoIHRoZSBsYXN0IGZhY3RvciBhcyB0aGUgYmFzZSwgLTEpOgoKYGBge3IsIGluY2x1ZGUgPSBUfQplZmFfYWxsX2tfc2NvcmVzIDwtIGVmYV9hbGxfayRzY29yZXNbXSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JQogIG11dGF0ZSh0YXJnZXQgPSBnc3ViKCJeLipfdGFyZ2V0IiwgInRhcmdldCIsIHN1YmlkKSwKICAgICAgICAgUmVzcG9uc2VJZCA9IGdzdWIoIl90YXJnZXQuKiQiLCAiIiwgc3ViaWQpKSAlPiUKICBzZWxlY3QoLXN1YmlkKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBzY29yZSwgLXRhcmdldCwgLVJlc3BvbnNlSWQpICU+JQogIG11dGF0ZV9hdCh2YXJzKHRhcmdldCwgZmFjdG9yKSwgZnVucyhmYWN0b3IpKQoKY29udHJhc3RzKGVmYV9hbGxfa19zY29yZXMkdGFyZ2V0KSA8LSBjb250ci5wb2x5KDMpCmNvbnRyYXN0cyhlZmFfYWxsX2tfc2NvcmVzJGZhY3RvcikgPC0gY29udHIuc3VtKHJldGVuX2FsbF9rKQoKcl9hbGxfayA8LSBsbWVyKHNjb3JlIH4gdGFyZ2V0ICogZmFjdG9yICsgKHRhcmdldCArIGZhY3RvciB8IFJlc3BvbnNlSWQpLAogICAgICAgICAgICAgICAgZWZhX2FsbF9rX3Njb3JlcykKc3VtbWFyeShyX2FsbF9rLCBjb3JyID0gRikKYGBgCgoqKlRoZXJlIGFyZSBzb21lIHByb2JsZW1zIHdpdGggdGhpcyBtb2RlbCB0aGF0IEkgaGF2ZW4ndCBhZGRyZXNzZWQqKiAtIHNlZSB3YXJuaW5ncyBhYm92ZS4gSWdub3JpbmcgdGhlbSBmb3Igbm93Li4uIAoKSWYgd2UgY29uc2lkZXIgdC12YWx1ZXMgPiAyIHRvIGJlICJzaWduaWZpY2FudCIgYW5kIHVzZSB0aGUgcGxvdCBhYm92ZSB0byBndWlkZSBvdXIgaW50ZXJwcmV0YXRpb24sIGhlcmUncyB3aGF0IHdlIGNvbmNsdWRlOgoKLSBbYChJbnRlcmNlcHQpYDogQnkgZGVmaW5pdGlvbiwgYmVjYXVzZSB3ZSdyZSB1c2luZyBmYWN0b3Igc2NvcmVzLCB3aGljaCBhcmUgc2ltaWxhciB0byB6LXNjb3JlcywgdGhlIGludGVyY2VwdCBpcyB+MC5dCi0gYHRhcmdldC5MYDogT3ZlcmFsbCwgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBpbmNyZWFzZSB3aXRoIHRhcmdldCBhZ2UuCi0gYHRhcmdldC5RYDogVGhpcyBpbmNyZWFzZSBpcyBnZW5lcmFsbHkgbm9uLWxpbmVhci4KLSBbYGZhY3RvcjFgOiBCeSBkZWZpbml0aW9uLCBiZWNhdXNlIHdlJ3JlIHVzaW5nIGZhY3RvciBzY29yZXMsIHdoaWNoIGFyZSBzaW1pbGFyIHRvIHotc2NvcmVzLCB0aGUgZGlmZmVyZW5jZXMgaW4gbWVhbnMgYWNyb3NzIGZhY3RvcnMgYXJlIH4wLl0KLSBgdGFyZ2V0Lkw6ZmFjdG9yMWA6IFRoZSBsaW5lYXIgaW5jcmVhc2UgaXMgbW9yZSBkcmFtYXRpYyAoc3RlZXBlciBzbG9wZSkgZm9yIE1SMSwgY29tcGFyZWQgdG8gb3RoZXIgZmFjdG9ycy4gCi0gYHRhcmdldC5ROmZhY3RvcjFgOiBUaGUgbm9ubGluZWFyaXR5IGlzIG1vcmUgZHJhbWF0aWMgKGN1cnZpZXIgYW5kL29yIGNvbmNhdmUgaW5zdGVhZCBvZiBjb252ZXggY3VydmUpIGZvciBNUjEsIGNvbXBhcmVkIHRvIG90aGVyIGZhY3RvcnMuIAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxLCBpbmNsdWRlID0gVH0KaXRlbXNwbG90X2Z1bihlZmFfYWxsX2ssIHRhcmdldCA9ICJhbGwiKSArIAogIGxhYnModGl0bGUgPSAiUHJlc2V0IGZhY3RvciByZXRlbnRpb24gY3JpdGVyaWEgKFdlaXNtYW4gZXQgYWwuLCAyMDE3KSIpCmBgYAoKIyMjIEhvdyBkbyB0aGVzZSBjb21wYXJlIHRvIHBhcmFsbGVsIGFuYWx5c2lzPwoKYGBge3J9CmVmYV9hbGxfcGFyJGxvYWRpbmdzW10gJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiY2FwYWNpdHkiKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBsb2FkaW5nLCAtY2FwYWNpdHkpICU+JQogIGdyb3VwX2J5KGNhcGFjaXR5KSAlPiUKICB0b3BfbigxLCBhYnMobG9hZGluZykpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QoLWxvYWRpbmcpICU+JQogIHJlbmFtZShwYXJfZmFjdG9yID0gZmFjdG9yKSAlPiUKICBsZWZ0X2pvaW4oZWZhX2FsbF9rJGxvYWRpbmdzW10gJT4lCiAgICAgICAgICAgICAgZGF0YS5mcmFtZSgpICU+JQogICAgICAgICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbigiY2FwYWNpdHkiKSAlPiUKICAgICAgICAgICAgICBnYXRoZXIoZmFjdG9yLCBsb2FkaW5nLCAtY2FwYWNpdHkpICU+JQogICAgICAgICAgICAgIGdyb3VwX2J5KGNhcGFjaXR5KSAlPiUKICAgICAgICAgICAgICB0b3BfbigxLCBhYnMobG9hZGluZykpICU+JQogICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUKICAgICAgICAgICAgICBzZWxlY3QoLWxvYWRpbmcpICU+JQogICAgICAgICAgICAgIHJlbmFtZShrX2ZhY3RvciA9IGZhY3RvcikpICU+JQogIGNvdW50KHBhcl9mYWN0b3IsIGtfZmFjdG9yKSAlPiUKICBzcHJlYWQoa19mYWN0b3IsIG4pCmBgYAoKCiMgRUZBOiBuZXdib3JucwoKV2hhdCBoYXBwZW5zIGlmIHdlIGxpbWl0IG91cnNlbHZlcyB0byBhc3Nlc3NtZW50cyBvZiBuZXdib3JucycgbWVudGFsIGNhcGFjaXRpZXM/CgojIyBQYXJhbGxlbCBhbmFseXNpcwoKIyMjIEhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluPwoKYGBge3J9CnJldGVuXzAwbW9fUEEgPC0gZmEucGFyYWxsZWwoZF8wMG1vLCBwbG90ID0gRik7IHJldGVuXzAwbW9fUEEKcmV0ZW5fMDBtb19wYXIgPC0gcmV0ZW5fMDBtb19QQSRuZmFjdApgYGAKCiMjIyBXaGF0IGFyZSB0aGVzZSBmYWN0b3JzPwoKYGBge3J9CmVmYV8wMG1vX3BhciA8LSBmYShkXzAwbW8sIG5mYWN0b3JzID0gcmV0ZW5fMDBtb19wYXIsIHJvdGF0ZSA9IGNob3Nlbl9yb3QsCiAgICAgICAgICAgICAgICAgIHNjb3JlcyA9ICJ0ZW5CZXJnZSIsIGltcHV0ZSA9ICJtZWRpYW4iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMS41fQpoZWF0bWFwX2Z1bihlZmFfMDBtb19wYXIpICsgCiAgbGFicyh0aXRsZSA9IHBhc3RlMCgiUGFyYWxsZWwgQW5hbHlzaXMgKHJvdGF0aW9uOiAiLCBjaG9zZW5fcm90LCAiKSIpKQpgYGAKCiMjIyBXaGljaCBjYXBhY2l0aWVzIGFyZSBhdHRyaWJ1dGVkIHRvIG5ld2Jvcm5zPwoKYGBge3IsIGZpZy53aWR0aCA9IDMuNSwgZmlnLmFzcCA9IDJ9Cml0ZW1zcGxvdF9mdW4oZWZhXzAwbW9fcGFyLCB0YXJnZXQgPSAibmV3Ym9ybnMiKSArIAogIGxhYnModGl0bGUgPSAiUGFyYWxsZWwgQW5hbHlzaXMiKQpgYGAKCgojIyBNaW5pbWl6aW5nIEJJQwoKIyMjIEhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluPwoKYGBge3J9CnJldGVuXzAwbW9fdnNzIDwtIFZTUyhkXzAwbW8sIHBsb3QgPSBGKTsgcmV0ZW5fMDBtb192c3MKcmV0ZW5fMDBtb19iaWMgPC0gZGF0YS5mcmFtZShyZXRlbl8wMG1vX3ZzcyR2c3Muc3RhdHMgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJuZmFjdG9ycyIpICU+JQogIHRvcF9uKC0xLCBCSUMpICU+JQogIHNlbGVjdChuZmFjdG9ycykpJG5mYWN0b3JzICU+JSBhcy5udW1lcmljKCkKYGBgCgojIyMgV2hhdCBhcmUgdGhlc2UgZmFjdG9ycz8KCmBgYHtyfQplZmFfMDBtb19iaWMgPC0gZmEoZF8wMG1vLCBuZmFjdG9ycyA9IHJldGVuXzAwbW9fYmljLCByb3RhdGUgPSBjaG9zZW5fcm90LAogICAgICAgICAgICAgICAgICAgc2NvcmVzID0gInRlbkJlcmdlIiwgaW1wdXRlID0gIm1lZGlhbiIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxLjV9CmhlYXRtYXBfZnVuKGVmYV8wMG1vX2JpYykgKyAKICBsYWJzKHRpdGxlID0gcGFzdGUwKCJNaW5pbWl6aW5nIEJJQyAocm90YXRpb246ICIsIGNob3Nlbl9yb3QsICIpIikpCmBgYAoKIyMjIFdoaWNoIGNhcGFjaXRpZXMgYXJlIGF0dHJpYnV0ZWQgdG8gbmV3Ym9ybnM/CgpgYGB7ciwgZmlnLndpZHRoID0gMy41LCBmaWcuYXNwID0gMn0KaXRlbXNwbG90X2Z1bihlZmFfMDBtb19iaWMsIHRhcmdldCA9ICJuZXdib3JucyIpICsgCiAgbGFicyh0aXRsZSA9ICJNaW5pbWl6aW5nIEJJQyIpCmBgYAoKCiMjIFByZXNldCByZXRlbnRpb24gY3JpdGVyaWEKCiMjIyBIb3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbj8KCmBgYHtyfQpyZXRlbl8wMG1vX2sgPC0gcmV0ZW5fZnVuKGRfMDBtbywgcm90X3R5cGUgPSBjaG9zZW5fcm90KQpwcmludChwYXN0ZSgiUHJlc2V0IGNyaXRlcmlhIHN1Z2dlc3QgcmV0YWluaW5nIiwgcmV0ZW5fMDBtb19rLCAiZmFjdG9ycyIpKQpgYGAKCiMjIyBXaGF0IGFyZSB0aGVzZSBmYWN0b3JzPwoKYGBge3J9CmVmYV8wMG1vX2sgPC0gZmEoZF8wMG1vLCBuZmFjdG9ycyA9IHJldGVuXzAwbW9faywgcm90YXRlID0gY2hvc2VuX3JvdCwKICAgICAgICAgICAgICAgICBzY29yZXMgPSAidGVuQmVyZ2UiLCBpbXB1dGUgPSAibWVkaWFuIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDEuNX0KaGVhdG1hcF9mdW4oZWZhXzAwbW9faykgKyAKICBsYWJzKHRpdGxlID0gcGFzdGUwKCJQcmVzZXQgY3JpdGVyaWEgKHJvdGF0aW9uOiAiLCBjaG9zZW5fcm90LCAiKSIpKQpgYGAKCiMjIyBXaGljaCBjYXBhY2l0aWVzIGFyZSBhdHRyaWJ1dGVkIHRvIG5ld2Jvcm5zPwoKYGBge3IsIGZpZy53aWR0aCA9IDMuNSwgZmlnLmFzcCA9IDJ9Cml0ZW1zcGxvdF9mdW4oZWZhXzAwbW9faywgdGFyZ2V0ID0gIm5ld2Jvcm5zIikgKyAKICBsYWJzKHRpdGxlID0gIlByZXNldCBmYWN0b3IgcmV0ZW50aW9uIGNyaXRlcmlhXG4oV2Vpc21hbiBldCBhbC4sIDIwMTcpIikKYGBgCgoKIyBFRkE6IDktbW9udGgtb2xkcwoKV2hhdCBoYXBwZW5zIGlmIHdlIGxpbWl0IG91cnNlbHZlcyB0byBhc3Nlc3NtZW50cyBvZiA5LW1vbnRoLW9sZHMnIG1lbnRhbCBjYXBhY2l0aWVzPwoKIyMgUGFyYWxsZWwgYW5hbHlzaXMKCiMjIyBIb3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbj8KCmBgYHtyfQpyZXRlbl8wOW1vX1BBIDwtIGZhLnBhcmFsbGVsKGRfMDltbywgcGxvdCA9IEYpOyByZXRlbl8wOW1vX1BBCnJldGVuXzA5bW9fcGFyIDwtIHJldGVuXzA5bW9fUEEkbmZhY3QKYGBgCgojIyMgV2hhdCBhcmUgdGhlc2UgZmFjdG9ycz8KCmBgYHtyfQplZmFfMDltb19wYXIgPC0gZmEoZF8wOW1vLCBuZmFjdG9ycyA9IHJldGVuXzA5bW9fcGFyLCByb3RhdGUgPSBjaG9zZW5fcm90LAogICAgICAgICAgICAgICAgICAgc2NvcmVzID0gInRlbkJlcmdlIiwgaW1wdXRlID0gIm1lZGlhbiIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxLjV9CmhlYXRtYXBfZnVuKGVmYV8wOW1vX3BhcikgKyAKICBsYWJzKHRpdGxlID0gcGFzdGUwKCJQYXJhbGxlbCBhbmFseXNpcyAocm90YXRpb246ICIsIGNob3Nlbl9yb3QsICIpIikpCmBgYAoKCiMjIyBXaGljaCBjYXBhY2l0aWVzIGFyZSBhdHRyaWJ1dGVkIHRvIDktbW9udGgtb2xkcz8KCmBgYHtyLCBmaWcud2lkdGggPSAzLjUsIGZpZy5hc3AgPSAyfQppdGVtc3Bsb3RfZnVuKGVmYV8wOW1vX3BhciwgdGFyZ2V0ID0gIjktbW9udGgtb2xkcyIpICsgCiAgbGFicyh0aXRsZSA9ICJQYXJhbGxlbCBBbmFseXNpcyIpCmBgYAoKCiMjIE1pbmltaXppbmcgQklDCgojIyMgSG93IG1hbnkgZmFjdG9ycyB0byByZXRhaW4/CgpgYGB7cn0KcmV0ZW5fMDltb192c3MgPC0gVlNTKGRfMDltbywgcGxvdCA9IEYpOyByZXRlbl8wOW1vX3ZzcwpyZXRlbl8wOW1vX2JpYyA8LSBkYXRhLmZyYW1lKHJldGVuXzA5bW9fdnNzJHZzcy5zdGF0cyAlPiUKICByb3duYW1lc190b19jb2x1bW4oIm5mYWN0b3JzIikgJT4lCiAgdG9wX24oLTEsIEJJQykgJT4lCiAgc2VsZWN0KG5mYWN0b3JzKSkkbmZhY3RvcnMgJT4lIGFzLm51bWVyaWMoKQpgYGAKCiMjIyBXaGF0IGFyZSB0aGVzZSBmYWN0b3JzPwoKYGBge3J9CmVmYV8wOW1vX2JpYyA8LSBmYShkXzA5bW8sIG5mYWN0b3JzID0gcmV0ZW5fMDltb19iaWMsIHJvdGF0ZSA9IGNob3Nlbl9yb3QsCiAgICAgICAgICAgICAgICAgICBzY29yZXMgPSAidGVuQmVyZ2UiLCBpbXB1dGUgPSAibWVkaWFuIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDEuNX0KaGVhdG1hcF9mdW4oZWZhXzA5bW9fYmljKSArIAogIGxhYnModGl0bGUgPSBwYXN0ZTAoIk1pbmltaXppbmcgQklDIChyb3RhdGlvbjogIiwgY2hvc2VuX3JvdCwgIikiKSkKYGBgCgojIyMgV2hpY2ggY2FwYWNpdGllcyBhcmUgYXR0cmlidXRlZCB0byA5LW1vbnRoLW9sZHM/CgpgYGB7ciwgZmlnLndpZHRoID0gMy41LCBmaWcuYXNwID0gMn0KaXRlbXNwbG90X2Z1bihlZmFfMDltb19iaWMsIHRhcmdldCA9ICI5LW1vbnRoLW9sZHMiKSArIAogIGxhYnModGl0bGUgPSAiTWluaW1pemluZyBCSUMiKQpgYGAKCgojIyBQcmVzZXQgcmV0ZW50aW9uIGNyaXRlcmlhCgojIyMgSG93IG1hbnkgZmFjdG9ycyB0byByZXRhaW4/CgpgYGB7cn0KcmV0ZW5fMDltb19rIDwtIHJldGVuX2Z1bihkXzA5bW8sIHJvdF90eXBlID0gY2hvc2VuX3JvdCkKcHJpbnQocGFzdGUoIlByZXNldCBjcml0ZXJpYSBzdWdnZXN0IHJldGFpbmluZyIsIHJldGVuXzA5bW9faywgImZhY3RvcnMiKSkKYGBgCgojIyMgV2hhdCBhcmUgdGhlc2UgZmFjdG9ycz8KCmBgYHtyfQplZmFfMDltb19rIDwtIGZhKGRfMDltbywgbmZhY3RvcnMgPSByZXRlbl8wOW1vX2ssIHJvdGF0ZSA9IGNob3Nlbl9yb3QsCiAgICAgICAgICAgICAgICAgc2NvcmVzID0gInRlbkJlcmdlIiwgaW1wdXRlID0gIm1lZGlhbiIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxLjV9CmhlYXRtYXBfZnVuKGVmYV8wOW1vX2spICsgCiAgbGFicyh0aXRsZSA9IHBhc3RlMCgiUHJlc2V0IGNyaXRlcmlhIChyb3RhdGlvbjogIiwgY2hvc2VuX3JvdCwgIikiKSkKYGBgCgojIyMgV2hpY2ggY2FwYWNpdGllcyBhcmUgYXR0cmlidXRlZCB0byA5LW1vbnRoLW9sZHM/CgpgYGB7ciwgZmlnLndpZHRoID0gMy41LCBmaWcuYXNwID0gMn0KaXRlbXNwbG90X2Z1bihlZmFfMDltb19rLCB0YXJnZXQgPSAiOS1tb250aC1vbGRzIikgKyAKICBsYWJzKHRpdGxlID0gIlByZXNldCBmYWN0b3IgcmV0ZW50aW9uIGNyaXRlcmlhXG4oV2Vpc21hbiBldCBhbC4sIDIwMTcpIikKYGBgCgoKIyBFRkE6IDUteWVhci1vbGRzCgpXaGF0IGhhcHBlbnMgaWYgd2UgbGltaXQgb3Vyc2VsdmVzIHRvIGFzc2Vzc21lbnRzIG9mIDUteWVhci1vbGRzJyBtZW50YWwgY2FwYWNpdGllcz8KCiMjIFBhcmFsbGVsIGFuYWx5c2lzCgojIyMgSG93IG1hbnkgZmFjdG9ycyB0byByZXRhaW4/CgpgYGB7cn0KcmV0ZW5fNjBtb19QQSA8LSBmYS5wYXJhbGxlbChkXzYwbW8sIHBsb3QgPSBGKTsgcmV0ZW5fNjBtb19QQQpyZXRlbl82MG1vX3BhciA8LSByZXRlbl82MG1vX1BBJG5mYWN0CmBgYAoKIyMjIFdoYXQgYXJlIHRoZXNlIGZhY3RvcnM/CgpgYGB7cn0KZWZhXzYwbW9fcGFyIDwtIGZhKGRfNjBtbywgbmZhY3RvcnMgPSByZXRlbl82MG1vX3Bhciwgcm90YXRlID0gY2hvc2VuX3JvdCwKICAgICAgICAgICAgICAgICAgIHNjb3JlcyA9ICJ0ZW5CZXJnZSIsIGltcHV0ZSA9ICJtZWRpYW4iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMS41fQpoZWF0bWFwX2Z1bihlZmFfNjBtb19wYXIpICsgCiAgbGFicyh0aXRsZSA9IHBhc3RlMCgiUGFyYWxsZWwgYW5hbHlzaXMgKHJvdGF0aW9uOiAiLCBjaG9zZW5fcm90LCAiKSIpKQpgYGAKCiMjIyBXaGljaCBjYXBhY2l0aWVzIGFyZSBhdHRyaWJ1dGVkIHRvIDUteWVhci1vbGRzPwoKYGBge3IsIGZpZy53aWR0aCA9IDMuNSwgZmlnLmFzcCA9IDJ9Cml0ZW1zcGxvdF9mdW4oZWZhXzYwbW9fcGFyLCB0YXJnZXQgPSAiNS15ZWFyLW9sZHMiKSArIAogIGxhYnModGl0bGUgPSAiUGFyYWxsZWwgQW5hbHlzaXMiKQpgYGAKCgojIyBNaW5pbWl6aW5nIEJJQwoKIyMjIEhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluPwoKYGBge3J9CnJldGVuXzYwbW9fdnNzIDwtIFZTUyhkXzYwbW8sIHBsb3QgPSBGKTsgcmV0ZW5fNjBtb192c3MKcmV0ZW5fNjBtb19iaWMgPC0gZGF0YS5mcmFtZShyZXRlbl82MG1vX3ZzcyR2c3Muc3RhdHMgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJuZmFjdG9ycyIpICU+JQogIHRvcF9uKC0xLCBCSUMpICU+JQogIHNlbGVjdChuZmFjdG9ycykpJG5mYWN0b3JzICU+JSBhcy5udW1lcmljKCkKYGBgCgojIyMgV2hhdCBhcmUgdGhlc2UgZmFjdG9ycz8KCmBgYHtyfQplZmFfNjBtb19iaWMgPC0gZmEoZF82MG1vLCBuZmFjdG9ycyA9IHJldGVuXzYwbW9fYmljLCByb3RhdGUgPSBjaG9zZW5fcm90LAogICAgICAgICAgICAgICAgICAgc2NvcmVzID0gInRlbkJlcmdlIiwgaW1wdXRlID0gIm1lZGlhbiIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxLjV9CmhlYXRtYXBfZnVuKGVmYV82MG1vX2JpYykgKyAKICBsYWJzKHRpdGxlID0gcGFzdGUwKCJNaW5pbWl6aW5nIEJJQyAocm90YXRpb246ICIsIGNob3Nlbl9yb3QsICIpIikpCmBgYAoKIyMjIFdoaWNoIGNhcGFjaXRpZXMgYXJlIGF0dHJpYnV0ZWQgdG8gNS15ZWFyLW9sZHM/CgpgYGB7ciwgZmlnLndpZHRoID0gMy41LCBmaWcuYXNwID0gMn0KaXRlbXNwbG90X2Z1bihlZmFfNjBtb19iaWMsIHRhcmdldCA9ICI1LXllYXItb2xkcyIpICsgCiAgbGFicyh0aXRsZSA9ICJNaW5pbWl6aW5nIEJJQyIpCmBgYAoKCiMjIFByZXNldCByZXRlbnRpb24gY3JpdGVyaWEKCiMjIyBIb3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbj8KCmBgYHtyfQpyZXRlbl82MG1vX2sgPC0gcmV0ZW5fZnVuKGRfNjBtbywgcm90X3R5cGUgPSBjaG9zZW5fcm90KQpwcmludChwYXN0ZSgiUHJlc2V0IGNyaXRlcmlhIHN1Z2dlc3QgcmV0YWluaW5nIiwgcmV0ZW5fNjBtb19rLCAiZmFjdG9ycyIpKQpgYGAKCiMjIyBXaGF0IGFyZSB0aGVzZSBmYWN0b3JzPwoKYGBge3J9CmVmYV82MG1vX2sgPC0gZmEoZF82MG1vLCBuZmFjdG9ycyA9IHJldGVuXzYwbW9faywgcm90YXRlID0gY2hvc2VuX3JvdCwKICAgICAgICAgICAgICAgICBzY29yZXMgPSAidGVuQmVyZ2UiLCBpbXB1dGUgPSAibWVkaWFuIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDEuNX0KaGVhdG1hcF9mdW4oZWZhXzYwbW9faykgKyAKICBsYWJzKHRpdGxlID0gcGFzdGUwKCJQcmVzZXQgY3JpdGVyaWEgKHJvdGF0aW9uOiAiLCBjaG9zZW5fcm90LCAiKSIpKQpgYGAKCiMjIyBXaGljaCBjYXBhY2l0aWVzIGFyZSBhdHRyaWJ1dGVkIHRvIDUteWVhci1vbGRzPwoKYGBge3IsIGZpZy53aWR0aCA9IDMuNSwgZmlnLmFzcCA9IDJ9Cml0ZW1zcGxvdF9mdW4oZWZhXzYwbW9faywgdGFyZ2V0ID0gIjUteWVhci1vbGRzIikgKyAKICBsYWJzKHRpdGxlID0gIlByZXNldCBmYWN0b3IgcmV0ZW50aW9uIGNyaXRlcmlhXG4oV2Vpc21hbiBldCBhbC4sIDIwMTcpIikKYGBgCgoKIyBTdWJzZXQgb2YgY2FwYWNpdGllcyBmcm9tIFdlaXNtYW4gZXQgYWwuICgyMDE3KQoKYGBge3J9CmRfYWxsX3dkbTIwMTcgPC0gZF9hbGwgJT4lCiAgc2VsZWN0KGJlaW5nX2F3YXJlX29mX3RoaW5ncywgZmVlbGluZ19jYWxtLCBmZWVsaW5nX2VtYmFycmFzc2VkLCAKICAgICAgICAgZmVlbGluZ19ndWlsdHksIGZlZWxpbmdfaGFwcHksIGZlZWxpbmdfbG92ZWQsIGZlZWxpbmdfcGFpbiwgCiAgICAgICAgIGZlZWxpbmdfcGxlYXN1cmUsIGZlZWxpbmdfcHJpZGUsIGZlZWxpbmdfc2FkLCBmZWVsaW5nX3NhZmUsIAogICAgICAgICBmZWVsaW5nX3NjYXJlZCwgZmVlbGluZ190aXJlZCwgZ2V0dGluZ19hbmdyeSwgZ2V0dGluZ19odW5ncnksIAogICAgICAgICBnZXR0aW5nX2h1cnRfZmVlbGluZ3MsIGhhdmluZ19nb2FscywgaGF2aW5nX3NlbGZfY29udHJvbCwgCiAgICAgICAgIGhhdmluZ190aG91Z2h0cywgaGF2aW5nX3dhbnRzX2FuZF9kZXNpcmVzLCBoZWFyaW5nX3NvdW5kcywgCiAgICAgICAgIG1ha2luZ19jaG9pY2VzLCBwbGFubmluZywgcmVhc29uaW5nX2Fib3V0X3RoaW5ncywgCiAgICAgICAgIHJlY29nbml6aW5nX290aGVyc19lbW90aW9ucywgcmVjb2duaXppbmdfc29tZWJvZHlfZWxzZSwgCiAgICAgICAgIHJlbWVtYmVyaW5nX3RoaW5ncywgc2VlaW5nLCB0ZWxsaW5nX3JpZ2h0X2Zyb21fd3JvbmcpCmBgYAoKYGBge3J9CmZhLnBhcmFsbGVsKGRfYWxsX3dkbTIwMTcpCmBgYAoKYGBge3J9ClZTUyhkX2FsbF93ZG0yMDE3LCByb3RhdGUgPSAidmFyaW1heCIpCmBgYAoKYGBge3J9CnJldGVuX2Z1bihkX2FsbF93ZG0yMDE3LCAidmFyaW1heCIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjh9CmZhKGRfYWxsX3dkbTIwMTcsIDMsICJ2YXJpbWF4IikgJT4lIGhlYXRtYXBfZnVuKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuOH0KZmEoZF9hbGxfd2RtMjAxNywgMiwgInZhcmltYXgiKSAlPiUgaGVhdG1hcF9mdW4oKQpgYGAKCgojIERlbW9ncmFwaGljcwoKYGBge3J9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gRHVyYXRpb24vNjApKSArIAogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1lZGlhbihkX2RlbW8kRHVyYXRpb24vNjApLCBjb2xvciA9ICJibHVlIiwgbHR5ID0gMikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAsIDQpKSArCiAgbGFicyh0aXRsZSA9ICJEdXJhdGlvbiBvZiBzdHVkeSAoYWNjb3JkaW5nIHRvIFF1YWx0cmljcykiLAogICAgICAgc3VidGl0bGUgPSAiQmx1ZSBkb3R0ZWQgbGluZSBtYXJrcyBtZWRpYW4iLAogICAgICAgeCA9ICJEdXJhdGlvbiAoaW4gbWludXRlcykiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7cn0KZF9kZW1vICU+JQogIGRpc3RpbmN0KFJlc3BvbnNlSWQsIER1cmF0aW9uKSAlPiUKICBtdXRhdGUoRHVyYXRpb24gPSBEdXJhdGlvbi82MCkgJT4lCiAgc3VtbWFyaXNlKG1lZGlhbiA9IG1lZGlhbihEdXJhdGlvbiksCiAgICAgICAgICAgIG1lYW4gPSBtZWFuKER1cmF0aW9uLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBzZCA9IHNkKER1cmF0aW9uLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBtaW4gPSBtaW4oRHVyYXRpb24sIG5hLnJtID0gVCksCiAgICAgICAgICAgIG1heCA9IG1heChEdXJhdGlvbiwgbmEucm0gPSBUKSkKYGBgCgpgYGB7cn0KZ2dwbG90KGRfZGVtbywgYWVzKHggPSBBZ2UpKSArIAogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1lZGlhbihkX2RlbW8kQWdlKSwgY29sb3IgPSAiYmx1ZSIsIGx0eSA9IDIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwLCA0KSkgKwogIGxhYnModGl0bGUgPSAiUGFydGljcGlhbnQgYWdlIChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICBzdWJ0aXRsZSA9ICJCbHVlIGRvdHRlZCBsaW5lIG1hcmtzIG1lZGlhbiIsCiAgICAgICB4ID0gIkFnZSAoaW4geWVhcnMpIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3J9CmRfZGVtbyAlPiUKICBkaXN0aW5jdChSZXNwb25zZUlkLCBBZ2UpICU+JQogIHN1bW1hcmlzZShtZWRpYW4gPSBtZWRpYW4oQWdlKSwKICAgICAgICAgICAgbWVhbiA9IG1lYW4oQWdlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBzZCA9IHNkKEFnZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgbWluID0gbWluKEFnZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgbWF4ID0gbWF4KEFnZSwgbmEucm0gPSBUKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDF9CmVmYV9hbGxfcGFyX3Njb3JlcyAlPiUKICBtdXRhdGUoUmVzcG9uc2VJZCA9IGFzLmNoYXJhY3RlcihSZXNwb25zZUlkKSkgJT4lCiAgbGVmdF9qb2luKGRfZGVtbyAlPiUgCiAgICAgICAgICAgICAgZGlzdGluY3QoUmVzcG9uc2VJZCwgQWdlKSAlPiUgCiAgICAgICAgICAgICAgbXV0YXRlKFJlc3BvbnNlSWQgPSBhcy5jaGFyYWN0ZXIoUmVzcG9uc2VJZCkpKSAlPiUKICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIk1SMSIsICJNUjMiLCAiTVIyIiwgIk1SNCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29nbml0aW9uICYgY29udHJvbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zaXRpdmUgJiBzb2NpYWwgZW1vdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm9kaWx5IHNlbnNhdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVnYXRpdmUgZW1vdGlvbnMiKSkpICU+JQogIGdncGxvdChhZXMoeCA9IEFnZSwgeSA9IHNjb3JlKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIpICsKICBmYWNldF9ncmlkKGZhY3RvciB+IHRhcmdldCwgc2NhbGVzID0gImZyZWUiKSArCiAgIyBnZW9tX3BvaW50KGFscGhhID0gMC4wNSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xMCwgMTAsIDEpKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IEdlbmRlclNleCkpICsgCiAgZ2VvbV9iYXIoKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCBnZW5kZXIvc2V4IChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICB4ID0gIkdlbmRlci9zZXgiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7cn0KZF9kZW1vICU+JQogIGRpc3RpbmN0KFJlc3BvbnNlSWQsIEdlbmRlclNleCkgJT4lCiAgY291bnQoR2VuZGVyU2V4KSAlPiUKICBtdXRhdGUocHJvcCA9IHJvdW5kKG4vc3VtKG4sIG5hLnJtID0gVCksIDIpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMX0KZWZhX2FsbF9wYXJfc2NvcmVzICU+JQogIG11dGF0ZShSZXNwb25zZUlkID0gYXMuY2hhcmFjdGVyKFJlc3BvbnNlSWQpKSAlPiUKICBsZWZ0X2pvaW4oZF9kZW1vICU+JSAKICAgICAgICAgICAgICBkaXN0aW5jdChSZXNwb25zZUlkLCBHZW5kZXJTZXgpICU+JSAKICAgICAgICAgICAgICBtdXRhdGUoUmVzcG9uc2VJZCA9IGFzLmNoYXJhY3RlcihSZXNwb25zZUlkKSkpICU+JQogIGZpbHRlcihHZW5kZXJTZXggJWluJSBjKCJGZW1hbGUiLCAiTWFsZSIpKSAlPiUKICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIk1SMSIsICJNUjMiLCAiTVIyIiwgIk1SNCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29nbml0aW9uICYgY29udHJvbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zaXRpdmUgJiBzb2NpYWwgZW1vdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm9kaWx5IHNlbnNhdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVnYXRpdmUgZW1vdGlvbnMiKSkpICU+JQogIGdncGxvdChhZXMoeCA9IEdlbmRlclNleCwgeSA9IHNjb3JlKSkgKwogIGZhY2V0X2dyaWQoZmFjdG9yIH4gdGFyZ2V0LCBzY2FsZXMgPSAiZnJlZSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSAyKSArCiAgIyBnZW9tX2ppdHRlcihhbHBoYSA9IDAuMDUsIGhlaWdodCA9IDApICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IC4gJT4lIAogICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KHRhcmdldCwgZmFjdG9yLCBHZW5kZXJTZXgpICU+JQogICAgICAgICAgICAgICAgICAgIG11bHRpX2Jvb3Rfc3RhbmRhcmQoY29sID0gInNjb3JlIikgJT4lCiAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgZmF0dGVuID0gMSwgY29sb3IgPSAiYmx1ZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xMCwgMTAsIDEpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IGdzdWIoJyguezEsMzB9KShcXHN8JCknLCAnXFwxXG4nLCBSYWNlRXRobmljaXR5X2NvbGxhcHNlKSkpICsgCiAgZ2VvbV9iYXIoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCByYWNlL2V0aG5pY2l0eSAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgeCA9ICJSYWNlL2V0aG5pY2l0eSIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpkX2RlbW8gJT4lCiAgZGlzdGluY3QoUmVzcG9uc2VJZCwgUmFjZUV0aG5pY2l0eV9jb2xsYXBzZSkgJT4lCiAgY291bnQoUmFjZUV0aG5pY2l0eV9jb2xsYXBzZSkgJT4lCiAgbXV0YXRlKHByb3AgPSByb3VuZChuL3N1bShuLCBuYS5ybSA9IFQpLCAyKSkgJT4lCiAgYXJyYW5nZShkZXNjKG4pKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IEZpcnN0TGFuZykpICsgCiAgZ2VvbV9iYXIoKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCBmaXJzdCBsYW5ndWFnZSAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgeCA9ICJMYW5ndWFnZSIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpkX2RlbW8gJT4lCiAgZGlzdGluY3QoUmVzcG9uc2VJZCwgRmlyc3RMYW5nKSAlPiUKICBjb3VudChGaXJzdExhbmcpICU+JQogIG11dGF0ZShwcm9wID0gcm91bmQobi9zdW0obiwgbmEucm0gPSBUKSwgMikpICU+JQogIGFycmFuZ2UoZGVzYyhuKSkKYGBgCgpgYGB7cn0KZ2dwbG90KGRfZGVtbywgYWVzKHggPSBmYWN0b3IoRWR1Y2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBsZXZlbHMoZCRFZHVjYXRpb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBnc3ViKCcoLnsxLDMwfSkoXFxzfCQpJywgJ1xcMVxuJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzKGQkRWR1Y2F0aW9uKSkpKSkgKyAKICBnZW9tX2JhcigpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIlBhcnRpY3BpYW50IGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgKHNlbGYtcmVwb3J0ZWQpIiwKICAgICAgIHggPSAiSGlnaGVzdCBsZXZlbCBvZiBlZHVjYXRpb24gY29tcGxldGVkIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3J9CmRfZGVtbyAlPiUKICBkaXN0aW5jdChSZXNwb25zZUlkLCBFZHVjYXRpb24pICU+JQogIGNvdW50KEVkdWNhdGlvbikgJT4lCiAgbXV0YXRlKHByb3AgPSByb3VuZChuL3N1bShuLCBuYS5ybSA9IFQpLCAyKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDF9CmVmYV9hbGxfcGFyX3Njb3JlcyAlPiUKICBtdXRhdGUoUmVzcG9uc2VJZCA9IGFzLmNoYXJhY3RlcihSZXNwb25zZUlkKSkgJT4lCiAgbGVmdF9qb2luKGRfZGVtbyAlPiUgCiAgICAgICAgICAgICAgZGlzdGluY3QoUmVzcG9uc2VJZCwgRWR1Y2F0aW9uKSAlPiUgCiAgICAgICAgICAgICAgbXV0YXRlKFJlc3BvbnNlSWQgPSBhcy5jaGFyYWN0ZXIoUmVzcG9uc2VJZCkpKSAlPiUKICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIk1SMSIsICJNUjMiLCAiTVIyIiwgIk1SNCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29nbml0aW9uICYgY29udHJvbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zaXRpdmUgJiBzb2NpYWwgZW1vdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm9kaWx5IHNlbnNhdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVnYXRpdmUgZW1vdGlvbnMiKSksCiAgICAgICAgIGhpX2xvd19lZCA9IGNhc2Vfd2hlbigKICAgICAgICAgICBhcy5udW1lcmljKEVkdWNhdGlvbikgPCA4IH4gImxlc3MgdGhhbiBCQSIsCiAgICAgICAgICAgYXMubnVtZXJpYyhFZHVjYXRpb24pID49IDggfiAiQkEgb3IgbW9yZSIpLAogICAgICAgICBoaV9sb3dfZWQgPSBmYWN0b3IoaGlfbG93X2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID1jKCJsZXNzIHRoYW4gQkEiLCAiQkEgb3IgbW9yZSIpKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gaGlfbG93X2VkLCB5ID0gc2NvcmUpKSArCiAgZmFjZXRfZ3JpZChmYWN0b3IgfiB0YXJnZXQsIHNjYWxlcyA9ICJmcmVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIpICsKICAjIGdlb21faml0dGVyKGFscGhhID0gMC4wNSwgaGVpZ2h0ID0gMCkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gLiAlPiUgCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkodGFyZ2V0LCBmYWN0b3IsIGhpX2xvd19lZCkgJT4lCiAgICAgICAgICAgICAgICAgICAgbXVsdGlfYm9vdF9zdGFuZGFyZChjb2wgPSAic2NvcmUiKSAlPiUKICAgICAgICAgICAgICAgICAgICB1bmdyb3VwKCksCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBmYXR0ZW4gPSAxLCBjb2xvciA9ICJibHVlIikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoLTEwLCAxMCwgMSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmBgYAoKYGBge3J9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gSW5jb21lKSkgKyAKICBnZW9tX2JhcigpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIlBhcnRpY3BpYW50IGhvdXNlaG9sZCBpbmNvbWUgKHNlbGYtcmVwb3J0ZWQpIiwKICAgICAgIHggPSAiQW5udWFsIGhvdXNlaG9sZCBpbmNvbWUiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7cn0KZF9kZW1vICU+JQogIGRpc3RpbmN0KFJlc3BvbnNlSWQsIEluY29tZSkgJT4lCiAgY291bnQoSW5jb21lKSAlPiUKICBtdXRhdGUocHJvcCA9IHJvdW5kKG4vc3VtKG4sIG5hLnJtID0gVCksIDIpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMX0KZWZhX2FsbF9wYXJfc2NvcmVzICU+JQogIG11dGF0ZShSZXNwb25zZUlkID0gYXMuY2hhcmFjdGVyKFJlc3BvbnNlSWQpKSAlPiUKICBsZWZ0X2pvaW4oZF9kZW1vICU+JSAKICAgICAgICAgICAgICBkaXN0aW5jdChSZXNwb25zZUlkLCBJbmNvbWUpICU+JSAKICAgICAgICAgICAgICBtdXRhdGUoUmVzcG9uc2VJZCA9IGFzLmNoYXJhY3RlcihSZXNwb25zZUlkKSkpICU+JQogIG11dGF0ZShmYWN0b3IgPSBmYWN0b3IoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTVIxIiwgIk1SMyIsICJNUjIiLCAiTVI0IiksCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJjb2duaXRpb24gJiBjb250cm9sIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGl2ZSAmIHNvY2lhbCBlbW90aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJib2RpbHkgc2Vuc2F0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWdhdGl2ZSBlbW90aW9ucyIpKSwKICAgICAgICAgaGlfbG93X2luYyA9IGNhc2Vfd2hlbigKICAgICAgICAgICBhcy5udW1lcmljKEluY29tZSkgPCA0IH4gImxlc3MgdGhhbiAkNjAsMDAxIiwKICAgICAgICAgICBhcy5udW1lcmljKEluY29tZSkgPj0gNCB+ICIkNjAsMDAxIG9yIG1vcmUiKSwKICAgICAgICAgaGlfbG93X2luYyA9IGZhY3RvcihoaV9sb3dfaW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9YygibGVzcyB0aGFuICQ2MCwwMDEiLCAiJDYwLDAwMSBvciBtb3JlIikpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGhpX2xvd19pbmMpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBoaV9sb3dfaW5jLCB5ID0gc2NvcmUpKSArCiAgZmFjZXRfZ3JpZChmYWN0b3IgfiB0YXJnZXQsIHNjYWxlcyA9ICJmcmVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIpICsKICAjIGdlb21faml0dGVyKGFscGhhID0gMC4wNSwgaGVpZ2h0ID0gMCkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gLiAlPiUgCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkodGFyZ2V0LCBmYWN0b3IsIGhpX2xvd19pbmMpICU+JQogICAgICAgICAgICAgICAgICAgIG11bHRpX2Jvb3Rfc3RhbmRhcmQoY29sID0gInNjb3JlIikgJT4lCiAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgZmF0dGVuID0gMSwgY29sb3IgPSAiYmx1ZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xMCwgMTAsIDEpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IEhvdXNlaG9sZFNpemUpKSArIAogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1lZGlhbihkX2RlbW8kSG91c2Vob2xkU2l6ZSksIGNvbG9yID0gImJsdWUiLCBsdHkgPSAyKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMCwgMSkpICsKICBsYWJzKHRpdGxlID0gIlBhcnRpY3BpYW50IGhvdXNlaG9sZCBzaXplIChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICBzdWJ0aXRsZSA9ICJCbHVlIGRvdHRlZCBsaW5lIG1hcmtzIG1lZGlhbiIsCiAgICAgICB4ID0gIk51bWJlciBvZiBwZW9wbGUgaW4gaG91c2Vob2xkIChhZHVsdHMgYW5kIGNoaWxkcmVuKSIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpkX2RlbW8gJT4lCiAgZGlzdGluY3QoUmVzcG9uc2VJZCwgSG91c2Vob2xkU2l6ZSkgJT4lCiAgc3VtbWFyaXNlKG1lZGlhbiA9IG1lZGlhbihIb3VzZWhvbGRTaXplKSwKICAgICAgICAgICAgbWVhbiA9IG1lYW4oSG91c2Vob2xkU2l6ZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgc2QgPSBzZChIb3VzZWhvbGRTaXplLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBtaW4gPSBtaW4oSG91c2Vob2xkU2l6ZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgbWF4ID0gbWF4KEhvdXNlaG9sZFNpemUsIG5hLnJtID0gVCkpCmBgYAoKYGBge3J9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gTWFyaXRhbFN0YXR1cykpICsgCiAgZ2VvbV9iYXIoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCBtYXJpdGFsIHN0YXR1cyAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgeCA9ICJNYXJpdGFsIHN0YXR1cyIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpkX2RlbW8gJT4lCiAgZGlzdGluY3QoUmVzcG9uc2VJZCwgTWFyaXRhbFN0YXR1cykgJT4lCiAgY291bnQoTWFyaXRhbFN0YXR1cykgJT4lCiAgbXV0YXRlKHByb3AgPSByb3VuZChuL3N1bShuLCBuYS5ybSA9IFQpLCAyKSkKYGBgCgpgYGB7cn0KZ2dwbG90KGRfZGVtbywgYWVzKHggPSBQYXJlbnQpKSArIAogIGdlb21fYmFyKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiUGFydGljcGlhbnQgcGFyZW50IHN0YXR1cyAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgc3VidGl0bGUgPSAiJ05BJyBpbmRpY2F0ZXMgcmVzcG9uc2Ugb2YgJ1ByZWZlciBub3QgdG8gc2F5JyIsCiAgICAgICB4ID0gIlBhcmVudCBzdGF0dXMiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7cn0KZF9kZW1vICU+JQogIGRpc3RpbmN0KFJlc3BvbnNlSWQsIFBhcmVudCkgJT4lCiAgY291bnQoUGFyZW50KSAlPiUKICBtdXRhdGUocHJvcCA9IHJvdW5kKG4vc3VtKG4sIG5hLnJtID0gVCksIDIpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMX0KZWZhX2FsbF9wYXJfc2NvcmVzICU+JQogIG11dGF0ZShSZXNwb25zZUlkID0gYXMuY2hhcmFjdGVyKFJlc3BvbnNlSWQpKSAlPiUKICBsZWZ0X2pvaW4oZF9kZW1vICU+JSAKICAgICAgICAgICAgICBkaXN0aW5jdChSZXNwb25zZUlkLCBQYXJlbnQpICU+JSAKICAgICAgICAgICAgICBtdXRhdGUoUmVzcG9uc2VJZCA9IGFzLmNoYXJhY3RlcihSZXNwb25zZUlkKSkpICU+JQogIGZpbHRlcighaXMubmEoUGFyZW50KSkgJT4lCiAgbXV0YXRlKGZhY3RvciA9IGZhY3RvcihmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJNUjEiLCAiTVIzIiwgIk1SMiIsICJNUjQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImNvZ25pdGlvbiAmIGNvbnRyb2wiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc2l0aXZlICYgc29jaWFsIGVtb3Rpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvZGlseSBzZW5zYXRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZ2F0aXZlIGVtb3Rpb25zIikpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBQYXJlbnQsIHkgPSBzY29yZSkpICsKICBmYWNldF9ncmlkKGZhY3RvciB+IHRhcmdldCwgc2NhbGVzID0gImZyZWUiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbHR5ID0gMikgKwogICMgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjA1LCBoZWlnaHQgPSAwKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSAuICU+JSAKICAgICAgICAgICAgICAgICAgICBncm91cF9ieSh0YXJnZXQsIGZhY3RvciwgUGFyZW50KSAlPiUKICAgICAgICAgICAgICAgICAgICBtdWx0aV9ib290X3N0YW5kYXJkKGNvbCA9ICJzY29yZSIpICU+JQogICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIGZhdHRlbiA9IDEsIGNvbG9yID0gImJsdWUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMTAsIDEwLCAxKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkKYGBgCgpgYGB7cn0KZ2dwbG90KGRfZGVtbyAlPiUgZmlsdGVyKFBhcmVudCA9PSAiWWVzIiksIGFlcyh4ID0gQ2hpbGRyZW5OdW1iZXIpKSArIAogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1lZGlhbihkX2RlbW9bZF9kZW1vJFBhcmVudCA9PSAiWWVzIixdJENoaWxkcmVuTnVtYmVyLCBuYS5ybSA9IFQpLCAKICAgICAgICAgICAgIGNvbG9yID0gImJsdWUiLCBsdHkgPSAyKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMSwgMTAwMDAsIDEpKSArCiAgbGFicyh0aXRsZSA9ICJOdW1iZXIgb2YgY2hpbGRyZW4gYW1vbmcgcGFyZW50cyAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgc3VidGl0bGUgPSAiQmx1ZSBkb3R0ZWQgbGluZSBtYXJrcyBtZWRpYW4iLAogICAgICAgeCA9ICJOdW1iZXIgb2YgY2hpbGRyZW4gKGFtb25nIHBhcmVudHMpIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3J9CmdncGxvdChkX2RlbW8gJT4lIGZpbHRlcihQYXJlbnQgPT0gIlllcyIpLCAKICAgICAgIGFlcyh4ID0gZmFjdG9yKENoaWxkcmVuT2xkZXN0QWdlX2NvbGxhcHNlLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gbGV2ZWxzKGRfZGVtbyRDaGlsZHJlbk9sZGVzdEFnZV9jb2xsYXBzZSksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBnc3ViKCcoLnsxLDMwfSkoXFxzfCQpJywgJ1xcMVxuJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyhkX2RlbW8kQ2hpbGRyZW5PbGRlc3RBZ2VfY29sbGFwc2UpKSkpKSArIAogIGdlb21fYmFyKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiQWdlIG9mIG9sZGVzdCBjaGlsZCBhbW9uZyBwYXJlbnRzIChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICB4ID0gIkFnZSBvZiBjaGlsZCBpbiB5ZWFycyAoYW1vbmcgcGFyZW50cykiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7cn0KZ2dwbG90KGRfZGVtbyAlPiUgZmlsdGVyKFBhcmVudCA9PSAiWWVzIiksIAogICAgICAgYWVzKHggPSBmYWN0b3IoQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9jb2xsYXBzZSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGxldmVscyhkX2RlbW8kQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9jb2xsYXBzZSksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBnc3ViKCcoLnsxLDMwfSkoXFxzfCQpJywgJ1xcMVxuJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyhkX2RlbW8kQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9jb2xsYXBzZSkpKSkpICsgCiAgZ2VvbV9iYXIoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJBZ2Ugb2YgeW91bmdlc3QgY2hpbGQgYW1vbmcgcGFyZW50cyAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgeCA9ICJBZ2Ugb2YgY2hpbGQgaW4geWVhcnMgKGFtb25nIHBhcmVudHMpIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKIyBTYXZlIEVGQSBvdXRwdXQKCkZpbmFsbHksIEknbGwgZXhwb3J0IHRoZSA0LWZhY3RvciBFRkEgcmVzdWx0cyB0byBhIHNhdmVkIGZpbGUgdGhhdCBJIGNhbiBkcmF3IG9uIGluIG91ciBTdHVkeSAyIGFuYWx5c2VzLgoKYGBge3J9CnNhdmVSRFMoZWZhX2FsbF9wYXIsIGZpbGUgPSAiLi9zMV9lZmEucmRzIikKd3JpdGUuY3N2KGRfZGVtbywgZmlsZSA9ICIuL3MxX2RlbW8uY3N2IikKd3JpdGUuY3N2KGRfYWxsLCBmaWxlID0gIi4vczFfZGF0YS5jc3YiKQpgYGAKCg==